前端下载文件

2023-05-16

文章目录

  • 前言
      • 二进制流
      • 前端核心实现下载功能有:
  • 一、a标签 + download属性
  • 二、window.open(url, "_blank")
  • 三、form表单
  • 四、接口请求 + blob + a标签+ download属性
  • 下载涉及的HTTP协议 header字段


前言

前端业务开发中,经常会遇到下载图片、文件等需求。前端需要拿到二进制流才能进行下载操作。

二进制流

在前后端交互中,二进制流可能是一个文件或者图片以流的形式传递。

前端核心实现下载功能有:

  1. <a href="xxx" downlaod="filname"></a>
  2. window.open()
  3. form表单提交
  4. ajax请求接口,处理文件流转为blob格式

在实际业务中,根据实际接口和URL具体情况,制定具体的实现方案


一、a标签 + download属性

适用场景:

  • fileUrl是【同源】的
  • Get请求
  • 不能设置请求头,不能携带token等验证身份信息

非适用异常场景:

  • 对于非同源URL,比如协议不一致,例如当前访问页面协议是https,而fileUrl是http协议地址,浏览器会拦截下载请求(在fileUrl同时支持http和https协议时,前端也可转换一下fileUrl协议)。
  • 对于非同源URL,协议一致,但是比如第三方链接:腾讯云图片链接,即使设置了download属性,在某些浏览器异常表现是:下载文件的同时会自动变更当前访问地址。
// 已知fileUrl, fileName
const a = document.createElement("a");
document.body.appendChild(a);
a.setAttribute("style", "display:none");
a.setAttribute("href", fileUrl);
a.setAttribute("download", fileName);  // 关键属性
a.click();
URL.revokeObjectURL(fileUrl);

二、window.open(url, “_blank”)

原理和a标签类似,也是适用于Get请求

三、form表单

使用场景:

  • POST\GET请求
  • 需要携带较多参数
  • 可以设置请求头,携带token等验证信息
const downLoadForm = ({ formData, url }) => {
    let formStr = `<form action="${url}" method="post" id="sendAll" target="_self">`;
    for (let k in formData) {
        formStr += `<input type="hidden" value="${formData[k]}" name="${k}" />`
    }
    formStr += `</form>`;
    const body = document.querySelector('body');
    const container = document.createElement('div');
    container.innerHTML = formStr;
    body.append(container);
    document.querySelector('#sendAll').submit();
    container.remove();
}

四、接口请求 + blob + a标签+ download属性

适用场景:

  • POST\GET请求
  • 要下载第三方(腾讯云)图片地址,可以让后端提供统一的下载接口,拿到文件流,前端通过blob接收解析,再用a标签下载
  • 可以设置请求头,携带token等验证用户信息
// axios定义接口方法downloadImg
export const downloadImg = (params) => {
  // 设置 responseType: 'blob'
  return axios.post(api.downloadImg, null, { params, responseType: 'blob' });
}

downloadImg({url}).then(data => {
    const blob = new Blob([data], {type: data.type});  // 关键代码
    const objectUrl = URL.createObjectURL(blob);
    const a = document.createElement("a");
    document.body.appendChild(a);
    a.setAttribute("style", "display:none");
    a.setAttribute("href", objectUrl);
    a.setAttribute("download", fileName);
    a.click();
    URL.revokeObjectURL(objectUrl);
}).catch(err => {
    console.log('err', err)
})

下载涉及的HTTP协议 header字段

  • Content-Type (实体头部用于指示资源的MIME类型 media type )
    具体查看:不同类型对应的media type
Content-Type: application/octet-stream
  • Content-Length (用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。)
  • Content-Disposition( 响应头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。)
Content-Disposition: attachment;filename=test.xlsx;filename*=UTF-8

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端下载文件 的相关文章

  • 11.基于STM32C8T6的四旋翼无人机的飞控制作----PID调试方法

    四旋翼PID参数的几种调试方法 xff0c 自己起的名字 xff0c xff0c xff0c 1 单轴法 将飞机固定在一个长杆上 xff0c 杆的两头固定于两个桌子上 xff0c 飞机的x轴或y轴与杆平行 xff0c 使其只有绕轴旋转一个自
  • STM32内存结构介绍和FreeRTOS内存分配技巧

    概述 这是我第一次使用FreeRTOS构建STM32的项目 xff0c 踩了好些坑 xff0c 又发现了我缺乏对于操作系统的内存及其空间的分配的知识 xff0c 故写下文档记录学习成果 文章最后要解决的问题是 xff0c 如何恰当地分配Fr
  • 使用JetPack4.2为NVIDIA Xavier刷机

    1 准备 Host xff1a Ubuntu 16 04或18 04系统 xff0c 配备鼠标 键盘 显示器 xff0c 联网 Xavier xff1a 配备鼠标 键盘 显示器 HDMI转VGA接口 xff08 连接显示器和Xavier x
  • Java与设备(PLC)通信

    通信名词 上位机 指可以直接发出操控命令的计算机 xff0c 一般是PC host computer master computer upper computer 控制者和提供服务者是上位机 xff1b 工控机 工作站 触摸屏可作为上位机
  • DAMA学习笔记

    第1章 数据管理 1 1 引言 1 数据管理 xff1a 为了实现数据价值 xff0c 制定计划 制度并执行 监督 2 数据管理专业人员 xff1a 技术人员 xff08 数据库管理员 网络管理员 程序员 xff09 和业务人员 xff08
  • 2023 学习日志

    2023 01 03 mybatis源码学习 学习视频 xff1a https www bilibili com video BV1Tp4y1X7FM p 61 1 amp vd source 61 cc82a52a9b9b8b31eca3
  • EL表达式两个foreach嵌套循环

    集合List中加List泛型的泛型 List lt RiskEvaSuitQuestion gt riskEvaSuitQuestionList 61 riskEvaSuitQuestionService getQueList 100003
  • JQuery通过radio,select改变隐藏显示div

    1 xff09 select下拉框控制div的隐藏与显示 lt script gt function checkYear var selectValue 61 34 select name 61 39 periodType 39 34 va
  • 开科唯识笔试

    对于这次的笔试 xff0c 我只想说BiShi 几道编程题加一道SQL题 1 找出所有三位数中的水仙花数 public void getNarcissusNums int g 61 0 s 61 0 b 61 0 sum 61 0 for
  • JDBC批量插入

    最近项目中有用到JDBC技术 xff0c 存在大量数据要进行插入 xff0c 通过研究采用批量插入速度快的不是一点点 下面简单比较了一下普通插入与批量插入5W条数据的时间效率 常规插入 xff1a 耗时12952ms public stat
  • 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)

    YY欢聚时代一年多前去面试过一次 xff0c 当时鄙视了 xff0c 在现在的公司呆了1年半了 xff0c 感觉做得很不爽 xff0c 而且薪资又不满意 xff0c 所以想找个新工作 xff0c 就想去YY面试 下面将两次YY面试的经历写出
  • exe应用程序无法启动,因为应用程序的并行配置不正确

    问题 xff1a exe应用程序无法启动 xff0c 因为应用程序的并行配置不正确 有关详细信息 xff0c 请参阅应用程序事件日志 xff0c 或使用命令行 sxstrace exe 工具 原因查找 xff1a 1 xff09 开始 所有
  • TortoiseSVN is locked in another working copy

    TortoiseSVN提交报错 TortoiseSVN is locked in another working copy 原因 xff1a 可能是因为打开了多个commit会话 xff0c 然后又去修改了提交文件的内容 xff0c 导致文
  • Java对接企业微信

    最近需要对接企业微信 xff0c 例如将风险测评结果推送给企业微信中对应的用户 xff0c 然后用户对结果进行查看与确认操作 xff0c 所以这里就涉及到两方面 xff1a 1 xff09 将外部系统内容推送到企业微信 xff1b 2 xf
  • 微众银行面试

    机缘巧合 xff0c 其实并没有换工作的想法 xff0c 却收到了微众的面试邀请 xff0c 就想着去看看当是增长见识吧 xff0c 因为已经好久没准备面试的事情了 xff0c 而且微众毕竟作为腾讯系的看起来好像也不错 说实话那边离地铁站是
  • #TP4056#--3.7V锂电池充放电电路(实践日志篇)

    成就更好的自己 本篇为小型电源的实践日志 xff0c 内附各种充电应用电路 xff0c 并开源TP4056应用电路AD的原理图和PCB xff1b 先放一点锂电池常识性的知识 xff1a 锂电池是一类由锂金属或锂合金为负极材料 使用非水电解
  • ROS四旋翼无人机快速上手指南(1):无人机系统硬件概述与指南简介

    成就更好的自己 ROS无人机快速上手指南旨在于让使用此无人机开发平台的比赛参赛人员 xff0c 算法设计人员 xff0c 无人机爱好者更加快速的了解底层控制运作原理 xff0c 从而缩短开发周期 xff0c 减少掉坑次数 xff0c 快速验
  • ROS四旋翼无人机快速上手指南(2):Ubuntu18.04与ROS系统

    成就更好的自己 目录 Jetson版Ubuntu以及ROS的安装 xff1a ROS特性及Nano开发问题 PX4与Gazebo仿真环境 ROS与MATMAB仿真 Jetson版Ubuntu以及ROS的安装 xff1a ROS机器人系统运行
  • ROS四旋翼无人机快速上手指南(4):阿木实验室PX4功能包飞行控制分析与讲解(重点章节)

    成就更好的自己 这一章详细讲解一下阿木实验室 AMOV 的开源项目px4 command功能包 xff0c 此功能包通过mavlink协议直接控制烧录px4固件的自驾仪 xff0c 还融合了来自各个传感器的位姿 xff0c 距离等信息 xf
  • ROS四旋翼无人机快速上手指南(5):快速部署上层算法的操作与思路

    成就更好的自己 经过本系列上一篇文章关于PX4 command飞行控制功能包的分析 xff0c 相信大家对于飞整个流程有个大概的了解 xff0c 本章将在此基础上详细讲解一下应用级算法构建的思路与操作方法 关于PX4 command飞行控制

随机推荐

  • USB系列-LibUSB使用指南(1)-Windows下的报错与踩坑

    成就更好的自己 时隔一年再次开始撰写博客 xff0c 这一年的时间经历了很多 xff0c 现在终于稳定下来 以后很长一段时间都能够稳定的学习和更新 时间将会聚焦于USB和PCIe的开发进行 xff0c 能和大家共同进步真的很高兴 本篇为US
  • rosdep init和rosdep update出现问题解决,以及ros编程问题

    如果你在执行 rosdep init 过程中出现以下错误 ERROR cannot download default sources list from https raw githubusercontent com ros rosdist
  • linux内核体系结构

    本节介绍了linux内核的编制模式和体制结构 xff0c 然后详细描述linux内核代码目录中组织形式以及子目录各个代码文件的主要功能以及基本调用的层次关系 一个完整可用的操作系统主要由4部分组成 xff1a 硬件 操作系统内核 操作系统服
  • 基于OpenLTE的4G移动通信网络实验指导书

    基于本人本科毕业设计的成果 xff0c 设计了一套基于开源SDR项目 OpenLTE的实验指导书 xff0c 可以指引读者通过平台源码 平台提供的实验和结合实验对3GPP规范的解读分析来更直观 更多元立体的学习无线通信技术 xff0c 而不
  • 一行代码实现数组中数据频次值

    问题 xff1a 一行代码实现统计数组中每个name出现的次数 数组示例如下 xff1a 期望结果 xff1a 39 哈哈 39 2 39 哈哈1 39 1 39 哈哈2 39 2 span class token keyword var
  • mac bash_profile报错导致所有命令失效解决办法

    项目场景 xff1a 搭建flutter环境时 xff0c 在mac下需要配置环境变量 问题描述 xff1a 配置环境变量 xff0c 需要修改 bash profile文件 xff0c 修改文件保存退出后 发现文件有报错 xff0c 导致
  • 我理解的“大前端”

    前言 随着业务场景越来越复杂 xff0c 前端技术也越来越丰富 xff0c 这几年也迎来爆发期 xff0c 大前端 的概念逐渐涌现 本图根据本人理解整理 xff0c 如有不足 xff0c 欢迎指正 xff0c 感谢 一 终端 PC端 PC端
  • 前端获取用户地理定位的几种方式(Geolocation API,微信,腾讯地图)

    文章目录 前言一 Geolocation API二 微信 SDK1 引入jssdk2 获取签名 xff0c 注入配置3 调用JS SDK api 获取位置 三 第三方服务 xff08 腾讯地图服务 xff09 1 引入js文件2 获取定位
  • H5 软键盘自动搜索功能

    业务场景 xff1a 通常APP中的顶部搜索栏 xff0c 都配一个搜索按钮 同时输入文字软键盘弹起 xff0c 回车键自动变成搜索键 xff0c 点击软键盘中的搜索能进行搜索功能 xff0c 如下图taobao所示 xff1a 思考 软键
  • 基于vue-cli3构建自己的UI库

    文章目录 前言一 创建项目二 编写组件1 button组件2 引入字体图标icon文件3 引入Button组件看效果 三 修改目录结构1 packages文件夹2 打包修改2 demo展示 四 将UI库部署到npm上五 项目使用自己的UI库
  • vue3源码分析(三)—— 响应式系统(reactivity)

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 定义响应式数据1 reactive target 2 createReactiveObject2 1 入参2 2 响应式创建过程2 3 proxy
  • vue3源码分析(四)—— shared工具函数

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言1 数组中移除某元素2 字符串转数字3 转为字符串4 判定值是否发生改变5 判定数据类型5 1 数组5 2 Map5 3 Set5 4 Date5 5
  • 如何将两个rosbag包合并或者提取rosbag包中某些话题到一个rosbag里

    代码叫做merge bag py 运行的时候 python merge bag py v 1028msf bag msf bag vinReNoOutlier bag 就把msf bag和vinReNoOutlier bag完全合并在一起了
  • 解决 vscode中js变量 文件不能自动跳转问题~

    项目场景 xff1a 在项目开发中 xff0c 为了便于理解js代码逻辑和调试 xff0c 通常会使用快捷键自动定位到变量原始定义的文件位置 mac中快捷键 xff1a command 43 鼠标点击 但在vue项目开发中 xff0c 发现
  • vue3源码分析(二)—— 初始化流程

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 createApp在项目中的使用二 createApp源码追溯1 创建app实例1 1 ensureRenderer1 2 ensureRende
  • JS基础 ——解释执行

    文章目录 前言一 词法分析二 预编译创建全局作用域GO对象创建局部作用域AO对象 三 代码执行总结 前言 大家都知道 xff0c JS是一种不需要编译的解释型语言 但其实在浏览器执行JS代码前 xff0c 也有一个词法分析和预编译过程 xf
  • vue 项目中引入字体文件的正确方式~

    文章目录 前言一 开发中需要什么样的字体1 字体图标2 特殊字体 二 项目中引入字体文件1 字体文件2 css文件3 项目使用该字体 总结 前言 在UI设计稿中 xff0c 可能会有一些特殊字体 xff0c 或者是一些字体图标 对于特殊字体
  • vue3 使用 swiper轮播库

    文章目录 前言一 Swiper引入方式1 HTML标签引入方式2 CommonJs引入方式3 ES引入方式 xff08 采用 xff09 二 使用Swiper总结 前言 轮播图在前端开发中 xff0c 是常见需求 而Swiper库是最受前端
  • vue-cli2 老项目webpack3升级webpack5过程总结

    文章目录 背景一 webpack5环境要求二 升级步骤1 脚手架webpack cli2 升级webpack包3 更新webpack相关插件3 1 不推荐或被移除的插件3 2 升级babel到7版本3 3 更新插件 4 修改配置4 1 新增
  • 前端下载文件

    文章目录 前言二进制流前端核心实现下载功能有 xff1a 一 a标签 43 download属性二 window open url 34 blank 34 三 form表单四 接口请求 43 blob 43 a标签 43 download属