今天做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. 使用智能AI在农业养殖业中风险预警的应用

    一.前言 之前写过一篇<物联网浏览器(IoTBrowser)-使用深度学习开发防浸水远程报警>文章,主要介绍了通过摄像头麦克风监测浸水报警器有无异常,当出现异常后进行紧急报警并推送微信通知 ...

  2. 解决 Docker CE 在无根模式(rootless)下无法通过 IPv6 拉取映像的问题

    折腾一天快把我逼疯了 本来 Docker 对 IPv6 的支持就不好,再来个 rootless,雪上加霜 首先,我们要区分 Docker Engine 和 里面的 Image. 拉取映像是 Docke ...

  3. .NET 轻量化定时任务调度 FreeScheduler

    前言 在平时项目开发中,定时任务调度是一项重要的功能,广泛应用于后台作业.计划任务和自动化脚本等模块. FreeScheduler 是一款轻量级且功能强大的定时任务调度库,它支持临时的延时任务和重复循 ...

  4. 需要多久才能看完linux内核源码?

    代码中自由颜如玉!代码中自有黄金屋! 一.内核行数 Linux内核分为CPU调度.内存管理.网络和存储四大子系统,针对硬件的驱动成百上千.代码的数量更是大的惊人. 先说说最早的内核linux 0.11 ...

  5. 仅花一天时间,开发者重制 32 年前经典 Mac 应用!

    导读:在这个快节奏的技术世界里,重温过去并从中汲取灵感总是一件有趣的事情.今天要介绍的是一款仅用一天时间重制的经典 Macintosh 应用--Stapler.这款应用最初发布于1992年,现在由一位 ...

  6. 并查集noi水题 (P1955 [NOI2015]程序自动分析)

    现将输入排序,把merge排在前面 ,避免冗余计算 1 n=rd(); 2 FOR(i,1,n) 3 { 4 s[i].x=rd(),a[++tot]=s[i].x, 5 s[i].y=rd(),a[ ...

  7. VMware 安装 OpenWrt

    准备 OpenWrt VMDK 固件映像 你可以直接下载 VMDK 版本的 OpenWrt 固件映像,或者自己构建一个,或者从 IMG 映像文件转换.一般来说 IMG 映像文件较为容易获取,因此下面介 ...

  8. Windows 不小心把管理员帐户弄没了怎么办

    今天折腾不小心把管理员帐号的权限给改没了,重启之后很多操作做不了.解决方法如下: Windows + R 打开运行,或者打开资源管理器,输入 control userpasswords2 命令打开用户 ...

  9. 【Python自动化】之特殊的自动化定位操作

    今天有时间了,想好好的把之前遇到过的自动化问题总结一下,以后有新的总结再更新 目录: 一.上传文件(4.11) 二.下拉框选择(4.11) 1.Select下拉框 2.非Select下拉框 三.下拉框 ...

  10. ELK快速部署(踩坑记录、常见报错解决)及常用架构讲解

    ELK = Elasticserach + Logstash + kibana(包含但不仅限于) 简介: Elasticsearch:分布式搜索和分析引擎,具有高可伸缩.高可靠和易管理等特点.基于 A ...