vue 前端通过后端返回的文件流,直接在浏览器下载文件(js)

接口调用成功,返回的数据是这种样子(有两种数据)

前端js:

aa(){
        let param = { Id: val.val.MongodbIds, FileName: val.val.FileName };
        this.$luleApi
          .DownloadFileById(param)
          .then((res) => {
           //获取文件名称 三种写法,主要是看后端给你返回的,我这里就用第一种
            const fileName = JSON.parse(res.config.data).FileName; 
//const fileName = window.decodeURI(decodeURIComponent(decodeURI(res.headers['content-disposition'].split(`''`) [1])));
           //const fileName= res.headers['content-disposition'].split('filename=')[1]
            const url = window.URL.createObjectURL(new Blob([res.data])); // 创建一个Blob对象,包含响应的数据(文件内容)。
            const link = document.createElement("a"); // // 创建一个<a>元素,用于触发下载。
            link.href = url; // 设置<a>元素的href属性为Blob对象的URL。 
            link.setAttribute("download", fileName); // 设置<a>元素的download属性为文件名,这样浏览器就知道下载的文件应该叫什么名字。 
            document.body.appendChild(link);// 将<a>元素添加到文档的body中(虽然这一步不是必需的,但可以避免在某些浏览器中出现问题)。  
            link.click(); // 触发<a>元素的点击事件,开始下载。  
            document.body.removeChild(link);  // 下载完成后,从文档中移除<a>元素。
          })
          .catch((err) => {});
}

ps: 如果根据上述操作之后,下载的图片无法预览,可以修改以下位置

api.js**********************
//旧写法 
//DownloadFileById: (params) => {
   // return service.post("api/GridFS/DownloadFileById", params);
 // },

  // 修改之后的
  DownloadFileById: (config, params) => {
    return service.post("api/GridFS/DownloadFileById", params, config);
  },


a.vue

修改为:
Download(data) {
      let param = {
        Id: "67455ac4fe011820f0c1c8a6",
        FileName: "病人详情-实时监测(1).png"
      };

      this.$luleApi
        .DownloadFileById({ responseType: "arraybuffer" }, param)
        .then((res) => {
          console.log('下载=====', res);

          const fileName = JSON.parse(res.config.data).FileName;
          const blob = new Blob([res.data], { type: "application/octet-stream" });
          debugger
          const url = URL.createObjectURL(blob);
           console.log(url, "下载1");
          const link = document.createElement("a");
          link.href = url;
          link.download = fileName; 
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
          URL.recycleObjectURL(url);
        })
        .catch((err) => { });
    },

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值