前端下载文件的几种方法

基于vue的mixin

export default {
  methods: {
    /**
     * @param {string} url
     * @param {string} fileName
     * 适用于单个除了img,video,audio,pdf的文件,通过链接直接下载文件
     */
    downloadWithUrl (url, fileName) {
      const aLink = document.createElement('a');
      aLink.style.display = 'none';
      aLink.href = url;
      aLink.download = fileName;
      aLink.target = '_blank';
      document.body.appendChild(aLink);
      aLink.click();
      document.body.removeChild(aLink); // 下载完成移除元素
    },
    /**
     * @param {object[]} imglist
     * @param {string} imglist[].name
     * @param {string} imglist[].url
     * 下载多个文件后生成压缩包,需要jszip&file-saver插件
     */
    downloadWithCompress (imglist, zipName) {
      const JSZip = require('jszip');
      const { saveAs } = require('file-saver');
      const zip = new JSZip();
      const promises = [];
      imglist.forEach((item) => {
        const fileData = this.$axios.get(item.url, {
          responseType: 'blob',
          withCredentials: false
        }).then((res) => {
          console.log(res);
          zip.file(item.name, res);
          return res;
        });
        promises.push(fileData);
      });
      Promise.all(promises).then(() => {
        zip.generateAsync({ type: 'blob' }).then((content) => {
          // 生成二进制流
          saveAs(content, '' + zipName + '.zip'); // 利用file-saver保存文件
        });
      });
    },
   	/**
     * @param {string} url 链接
     * @param {string} name 文件名称
     * 适用于单个文件流下载
     */
    async downloadWithStream (url, fileName) {
      const fileStream = await this.$axios.get(url, {
        responseType: 'blob',
        withCredentials: false
      }).catch(() => {
        return false;
      });
      if (!fileStream) {
        return false;
      }
      const result = new Promise((resolve, reject) => {
        const file = new FileReader();
        file.readAsDataURL(fileStream.data);
        file.onload = function () {
          const aLink = document.createElement('a');
          aLink.style.display = 'none';
          aLink.href = file.result;
          aLink.setAttribute('download', fileName);
          document.body.appendChild(aLink);
          aLink.click();
          document.body.removeChild(aLink); // 下载完成移除元素
          resolve(true);
        };
      });
      return result;
    }
  }
};

提示,如果服务端为下载url设置了请求头

Content-Disposition: attachment; filename="filename.xls"

那么我们可以直接使用a标签下载,无需关注浏览器是否支持该文档格式

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值