今天做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. 使用Typora编写后的md文件优雅的上传到博客(插件dotnet-cnblog的使用)

    一.Typora的设置 如下图,设置图片上传位置 之后文章上的图片都会临时存放到文件同级目录下的xxx.Asster文件夹下面. 二.下载插件dotnet-cnblog 1.安装.Net Core S ...

  2. 微服务全链路跟踪:jaeger增加tag参数

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  3. quartz监控日志(三)查看卡死线程堆栈 转

    我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是jstack命令 来查看线程堆栈,然后根据我们监控中的threadId或者threadName来查找线程详细堆栈看卡在哪 ...

  4. 使用 reloadNuxtApp 强制刷新 Nuxt 应用

    title: 使用 reloadNuxtApp 强制刷新 Nuxt 应用 date: 2024/8/22 updated: 2024/8/22 author: cmdragon excerpt: re ...

  5. 【前端js】之小数点保留时的四舍五入问题

    项目遇到金额小数点保留位数,极个别的数会差一分,经调查是因为js的问题. 解决办法: # 方法一:保留两位小数 function keepTwoDecimal(num) { var result = ...

  6. 从代码到产品,我的IT职业成长之路

    每个人的职业生涯都是一段充满转折和挑战的旅程,当然每一次职业转型都是一次重新定义自己的机会,从2015年开始,当时我刚踏入IT行业,成为一名Java开发者,后来随着时间的推移,我的职业方向逐渐转向了前 ...

  7. WiFi基础(二):最新WiFi信道、无线OSI模型与802.11b/g/n

    liwen01 2024.09.01 前言 最近十几年,通信技术发展迅猛,通信标准更新频繁,有的设备还在使用 802.11/b/g/n 协议,有的已支持到 WiFi6.WiFi7. 而国内有关无线 W ...

  8. git重命名文件夹

    在源代码文件夹中打开git bash, 不同名称的文件夹命令: 1. git mv  A An 3. git add -u An 4.  git commit -m "重命名A为An&quo ...

  9. VC 单文档FormView视图增加打印预览

    1修改my.rc文件二处 3 TEXTINCLUDE BEGIN "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO ...

  10. 痞子衡嵌入式:如果i.MXRT离线无法启动,试着分析ROM启动日志

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT系列MCU的ROM启动日志. 关于 i.MX RT 启动问题解决的文章,痞子衡写过非常多,其中大部分都是具体到某一类启 ...