前端实现文件下载功能——文件流
  Ml0kntzreFoq 2023年11月01日 56 0
Vue

前端下载文件一般使用的是blob

核心的步骤是获取后端响应的文件流,用blob创建一个临时的URL,然后创建一个隐藏的<a>标签,实现下载需求。

那就先上代码

function download(item) {
    axios.get(getServerUrl() + "/teacher/output/" + classId.value + "/" + item, {
        responseType: 'blob', // 告诉浏览器响应类型是 Blob
    }).then((response) => {
        let blob = new Blob([response.data]);
        // 创建一个临时 URL,用于下载
        const url = URL.createObjectURL(blob);
        let fileName = item + '签到统计表.xls';
        const a = document.createElement('a');
        a.setAttribute('href', url);
        a.setAttribute('download', fileName);
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        // 释放临时 URL
        URL.revokeObjectURL(url);
    })
}

如果后端响应的数据是一个二进制数据,那我们就得这是响应类型是blob,否则浏览器会默认按照json解析

至于后端如何向前端以文件流的形式发送文件,请看我的上一个随笔Java后端向前端返回文件流——实现下载功能

是否会有朋友有个疑问,前端要不要在new BLob里面设置content-type,答案是不需要,其实你会发现设置与不设置效果一样,但如果后端没有设置,那么文件下载就会出问题。我之前在写一个web项目要实现一个下载功能,一直以为要前端规定格式,结果后端就没有设置,导致下载的文件格式错误。

所以说,只要后端的文件流正确,响应类型设置正确,前端只需要将responseType设置为blob即可。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  gYl4rku9YpWY   2024年05月17日   57   0   0 Vue
  JZjRRktyDDvK   2024年05月02日   83   0   0 Vue
  VlNAKfyhjjp9   2024年04月30日   80   0   0 Vue
  JNTrZmaOQEcq   2024年04月30日   58   0   0 Vue
  onf2Mh1AWJAW   2024年05月17日   61   0   0 Vue
  3A8RnFxQCDqM   2024年05月17日   59   0   0 Vue
Ml0kntzreFoq