前端下载文件的几种方式
前端下载文件的几种方式
在网页需要下载文件功能时需要进行点击下载功能,下面列出几种常见文件下载的方式
1.直接下载
通过在浏览器地址栏输入相应下载url进行下载,本质为发送GET请求进行下载
2.利用a标签的download属性进行点击下载
<a href="完整下载地址">点击下载</a>
但是这样会有一个问题,就是下载是可以下载了,但是同样触发了a标签的页面跳转功能。
<a :href="`${完整的下载地址}`" target="downloadFile">{{文件名称}}</a>
3.使用location.href
后端接口为GET请求
Vue文件中自定义点击事件
<el-button @click="exportPassList">导出</el-button>
methods:
exportPassList() {
let a =
"/请求地址/请求地址/接口名称?参数=" +
this.indexCode +
"&参数=" +
this.time
location.href = a;
},
4.文件流方式
// 此种方式的优点是支持多文件下载、post下载、自定义文件名称,流程是向后端发送post请求,后端返回文件流,前端将文件流转成下载链接
// 原生js请求写法(不可以使用JQuery,因为JQuery不支持blob类型)
function download() {
const req = new XMLHttpRequest();
req.open('POST', '/download/excel', true);
req.responseType = 'blob'; //如果不指定,下载后文件会打不开
req.setRequestHeader('Content-Type', 'application/json');
req.onload = function() {
var content = req.getResponseHeader("Content-Disposition") ;
// 文件名最好用后端返的Content-disposition
// 需要后端设置 Access-Control-Expose-Headers: Content-disposition 使得浏览器将该字段暴露给前端
var name = content && content.split(';')[1].split('filename=')[1];
var fileName = decodeURIComponent(name)
downloadFile(req.response,fileName) // 调用将文件流转成文件的方法,后面有写
};
req.send( JSON.stringify(params));
}
// axios请求写法
function download() {
axios({
method: 'post',
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
url: '/robot/strategyManagement/analysisExcel',
responseType: 'blob',
headers: { //如果需要权限下载的话,加在这里
Authorization: '123456'
}
data: JSON.stringify(params),
}).then(function(res){
var content = res.headers['content-disposition'];
var name = content && content.split(';')[1].split('filename=')[1];
var fileName = decodeURIComponent(name)
downloadFile(res.data,fileName)// 调用将文件流转成文件的方法,后面有写
})
}
例: get请求的文件流下载
download() {
// 初始化参数
axios.get("/xxx/xxx/export", {
params: {
pageSize: 10
pageNo: 1,
},
responseType: "blob" // 1.首先设置responseType对象格式为 blob:
}).then(res => {
//resolve(res)
// 2.获取请求返回的response对象中的blob 设置文件类型,这里以excel为例
let blob = new Blob([res.data], {
type: "application/vnd.ms-excel"
});
// 3.创建一个临时的url指向blob对象
let url = window.URL.createObjectURL(blob);
// 4.创建url之后可以模拟对此文件对象的一系列操作,例如:预览、下载
let a = document.createElement("a");
a.href = url;
a.download = "导出数据_" + new Date().getTime() + ".xlsx"; //自定义导出文件名
a.click();
// 5.释放这个临时的对象url
window.URL.revokeObjectURL(url);
return _this.$message.success("导出成功");
},
err => {
resolve(err.response);
}
)
}
...
..
.
本文作者:朝颜浅语
本文链接:https://www.cnblogs.com/ommggg/p/16451276.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
,
标签:
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步