今天做antdV表格勾选下载操作时,因为粗心大意碰到了下载问题,特此记录~

一、单个文件下载逻辑代码如下:

const exportFile = (data, fileName, _this)=>{
 // 地址不存在时,禁止操作
if(!data)return;
// 下载文件并保存到本地
const callback = (data)=>{
   // 创建a标签,使用 html5 download 属性下载,
const link = document.createElement('a');
   // 创建url对象
const objectUrl = window.URL.createObjectURL(new Blob([data]));
link.style.display='none';
link.href=objectUrl;
   // 自定义文件名称, fileName
   link.download = fileName;
   document.body.appendChild(link);
   link.click();
   // 适当释放url
window.URL.revokeObjectURL(objectUrl);
  };
// 把接口返回的url地址转换为 blob
const xhr = new XMLHttpRequest();
xhr.open('get', data, true);
xhr.responseType = 'blob';
xhr.onload = ()=> {
   // 返回文件流,进行下载处理
callback(xhr.response);
};
xhr.send(); // 不要忘记发送
};

//
ie和浏览器兼容模式会有问题,可以用下面代码调试。
 try{
    exportFile(); // 调用方式
  }catch(err){
    // 兼容模式下,IE
    const exportBlob = new Blob([data]);
    if (navigator.userAgent.indexOf('Trident') > -1) {
      window.navigator.msSaveBlob(data, fileName);
    } else {
      exportFile(); // 调用方式
    }
  };
  

调用方式:

exportFile('https://reading.oss.iyougu.com/uploads/mp/opus/1c5a8b6a391742cf93595d0a506b2d43.mp3', '测试.mp3');
exportFile('https://reading.oss.iyougu.com/uploads/mp/opus/2595f553407e471085de7f508afe5cb9.mp4', '测试.mp4');

  *表格数据有音频、视频文件,所以逻辑上区分了文件后缀名!

二、批量下载,压缩打包成zip:

  项目框架用的vue,已安装 axios,先安装依赖 jszip , file-saver;

    npm install jszip
npm install file-saver

  

  主要业务代码如下:

  

    function filesToRar(arr, filename){
const _this=this;
const zip = new JSZip(); // 创建实例
const cache = {}; // 记录压缩文件,不做实际用处
const promiseArr = []; // 异步存储下载的二进制数据
_this.$message.loading({ content: '正在加载压缩文件', key: 'filesRAR'}); // 结合antdv 组件提示
      const getFile = url => {
url = url.replace('http://','https://'); // 根据域名有必要进行替换
return new Promise((resolve, reject) => {
axios({
method:'get',
url,
responseType: 'arraybuffer'
}).then(data => {
resolve(data.data);
}).catch(error => {
reject(error.toString()); // 异常信息,暂不接收
});
});
};
for(const item of arr){
const promise = getFile(item.yunUrl).then(res =>{
const name = item.resName;
const type = item.opusType === '视频'?'mp4':'mp3'; // 区分音视频链接,并重命名
zip.file(`${name}.${type}`, res, { binary: true}); // 添加文件,res可以是File文件也可以是Blob二进制数据。
      // 或者用zip.folder添加成文件夹
          cache[name]=res;
});
promiseArr.push(promise); // 追加数据
}
Promise.all(promiseArr).then(() => {
     // 生成zip文件
zip.generateAsync({ type: 'blob'}).then(content => {
_this.$message.loading({ content: '正在压缩', key: 'filesRAR'});
FileSaver.saveAs(content, filename); // 生成二进制流,可以上传也可以存储。此处是浏览器打包并下载。
_this.$message.success({ content: '压缩完成', key: 'filesRAR'});
_this.isLoading = false;
});
}).catch(err =>{
console.log(err);
_this.isLoading = false;
_this.$message.error('文件压缩失败');
});
}

调用方式:   filesToRar(arr, '文件.zip')

注意:下载的文件是音视频文件,等待时间稍长,大家有什么好的解决办法吗?

完成!o(* ̄▽ ̄*)ブ

如果您觉得有用的话给个推荐吧

有问题在评论区多多交流嗷~~

JS 通过后台接口返回的URL地址下载文件并保存到本地(已在项目中使用,保存音视频文件)的更多相关文章

  1. 酷友观点/经验:支付接口返回数据接收地址,session数据丢失(或者说失效)的问题浅析(原创文章)

    酷友观点/经验:支付接口返回数据接收地址,session数据丢失(或者说失效)的问题浅析(原创文章)   最近手头在开发一个游戏官网,在支付模块采用神州付技术支持,神州付数据表单中要求提供服务器返回地 ...

  2. js调用后台接口进行下载

    js调用后台接口一定不能用ajax location.href=$$pageContextPath +'downfile/down.do?filname='+row.fileUrl;

  3. 微信小程序实操-image height:auto问题,url地址报错,“不在以下合法域名列表中”问题等

    1.修改app顶部title 使用API: wx.setNavigationBarTitle({ title: 'titleName'}); 2.ajax请求 wx.request({ url: 'h ...

  4. python-根据URL地址下载文件

    博主个人网站:https://chenzhen.online 使用Python中提供的urllib.request下载网上的文件 #coding=utf-8 """ 目标 ...

  5. 【linux】【FastDFS】FastDFS上传返回的url直接下载和下载文件的文件名问题

    FastDFS安装及其他问题参考:https://www.cnblogs.com/jxd283465/p/11556263.html直接调用FastDFS返回的url,浏览器访问后默认打开方式./us ...

  6. URL地址下载图片到本地

    package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...

  7. 使用JS获取上一页的url地址

    一般来说每个页面上面都有一个返回按钮,用来返回上一页,代码如下: <a href="javascript:history.go(-1)" class="jsBack ...

  8. uni-app 解析后台接口返回的HTML

    正常使用rich-text是可以解决问题的,但是在支付宝小程序中不显示,在文档中看到" 支付宝小程序 nodes 属性只支持使用 Array 类型.如果需要支持 HTML String,则需 ...

  9. 去除DEDECMS后台预览文章URL地址多余的数字信息

    在使用织梦模板时发现这样一个问题:在后台预览文章的时候,出现的文章网址尽管是静态URL,但是会在网址的尾部出现问号并跟随一个时间戳,在复制URL时就显得很不方便.那么如何解决这一问题呢? 经过查找资料 ...

  10. 昨天写支付接口时遇到支付接口返回数据接收地址,session数据丢失(或者说失效)的问题

    在网上找了好久 才找到答案 分享给大家 http://www.zcool.com.cn/article/ZMzYwNTI=.html

随机推荐

  1. [CEOI2018] Lottery 题解

    前言 题目链接:洛谷. 题意简述 给出序列 \(a_1 \ldots a_n\) 和常数 \(l \leq n\),定义: \[\operatorname{dis}(i, j) = \sum _ {k ...

  2. DataOps真能“降本增效”?

    在各行各业中,越来越多的公司开始重视收集数据,并寻找创新方法来获得真实可行的商业成果,并且愿意投入大量时间和金钱来实现这一目标. 据IDC称,数据和分析软件及云服务市场规模在 2021 年达到了 90 ...

  3. 恭喜社区迎来新PMC成员!

    恭喜Apache SeaTunnel社区又迎来一位PMC Member@liugddx!在社区持续活跃的两年间,大家经常看到这位开源爱好者出现在社区的各种活动中,为项目和社区发展添砖加瓦.如今成为项目 ...

  4. blender-主要操作技巧

    E 或 G 或 S 之后 不在同一平面的 处理1切换正视图    alt + z 切换透视模式  s + z +0 变成同一平面

  5. Dijkstra单源最短路模板

    struct DIJ { using i64 = long long; using PII = pair<i64, i64>; vector<i64> dis; vector& ...

  6. dubbo超时异常 荐

    dubbo超时异常 在调用dubbo服务时经常看到如下错误: Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting serve ...

  7. 线性dp:最长公共子序列

    最长公共子序列 本文讲解的题与leetcode1143.最长公共子序列这题一样,阅读完可以挑战一下. 力扣题目链接 题目叙述: 给定两个字符串,输出其最长公共子序列,并输出它的长度 输入: ADABE ...

  8. TwinCAT3 - 实现自己的Dictionary

    目录 1,前言 2,C#的字典 3,TwinCAT3的字典 定义功能块 添加方法 4,用起来 1,前言 C#有字典,TwinCAT没字典,咋办,自己写一个咯 2,C#的字典 C#的字典使用很简单,下面 ...

  9. 电商API接口应该如何使用?

    从定义上看,API接口是指预先定义的一组规则和协议,允许不同的软件应用之间相互通信和交换数据. 目前,市场中电商行业用到API接口的场景较多,电商API接口则是专门针对电子商务应用场景所提供的API, ...

  10. 构建 OpenWrt

    OpenWrt 是一款路由器操作系统.如果你想要给自己的路由器安装 OpenWrt 的话,一般来说使用别人已经构建好的 OpenWrt 固件就够用了.当然如果你闲得没事干,那么也可以自己构建固件. P ...