JS 通过后台接口返回的URL地址下载文件并保存到本地(已在项目中使用,保存音视频文件)
今天做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和浏览器兼容模式会有问题,可以用下面代码调试。
调用方式:
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地址下载文件并保存到本地(已在项目中使用,保存音视频文件)的更多相关文章
- 酷友观点/经验:支付接口返回数据接收地址,session数据丢失(或者说失效)的问题浅析(原创文章)
酷友观点/经验:支付接口返回数据接收地址,session数据丢失(或者说失效)的问题浅析(原创文章) 最近手头在开发一个游戏官网,在支付模块采用神州付技术支持,神州付数据表单中要求提供服务器返回地 ...
- js调用后台接口进行下载
js调用后台接口一定不能用ajax location.href=$$pageContextPath +'downfile/down.do?filname='+row.fileUrl;
- 微信小程序实操-image height:auto问题,url地址报错,“不在以下合法域名列表中”问题等
1.修改app顶部title 使用API: wx.setNavigationBarTitle({ title: 'titleName'}); 2.ajax请求 wx.request({ url: 'h ...
- python-根据URL地址下载文件
博主个人网站:https://chenzhen.online 使用Python中提供的urllib.request下载网上的文件 #coding=utf-8 """ 目标 ...
- 【linux】【FastDFS】FastDFS上传返回的url直接下载和下载文件的文件名问题
FastDFS安装及其他问题参考:https://www.cnblogs.com/jxd283465/p/11556263.html直接调用FastDFS返回的url,浏览器访问后默认打开方式./us ...
- URL地址下载图片到本地
package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...
- 使用JS获取上一页的url地址
一般来说每个页面上面都有一个返回按钮,用来返回上一页,代码如下: <a href="javascript:history.go(-1)" class="jsBack ...
- uni-app 解析后台接口返回的HTML
正常使用rich-text是可以解决问题的,但是在支付宝小程序中不显示,在文档中看到" 支付宝小程序 nodes 属性只支持使用 Array 类型.如果需要支持 HTML String,则需 ...
- 去除DEDECMS后台预览文章URL地址多余的数字信息
在使用织梦模板时发现这样一个问题:在后台预览文章的时候,出现的文章网址尽管是静态URL,但是会在网址的尾部出现问号并跟随一个时间戳,在复制URL时就显得很不方便.那么如何解决这一问题呢? 经过查找资料 ...
- 昨天写支付接口时遇到支付接口返回数据接收地址,session数据丢失(或者说失效)的问题
在网上找了好久 才找到答案 分享给大家 http://www.zcool.com.cn/article/ZMzYwNTI=.html
随机推荐
- 使用Typora编写后的md文件优雅的上传到博客(插件dotnet-cnblog的使用)
一.Typora的设置 如下图,设置图片上传位置 之后文章上的图片都会临时存放到文件同级目录下的xxx.Asster文件夹下面. 二.下载插件dotnet-cnblog 1.安装.Net Core S ...
- 微服务全链路跟踪:jaeger增加tag参数
微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...
- quartz监控日志(三)查看卡死线程堆栈
转
我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是jstack命令 来查看线程堆栈,然后根据我们监控中的threadId或者threadName来查找线程详细堆栈看卡在哪 ...
- 使用 reloadNuxtApp 强制刷新 Nuxt 应用
title: 使用 reloadNuxtApp 强制刷新 Nuxt 应用 date: 2024/8/22 updated: 2024/8/22 author: cmdragon excerpt: re ...
- 【前端js】之小数点保留时的四舍五入问题
项目遇到金额小数点保留位数,极个别的数会差一分,经调查是因为js的问题. 解决办法: # 方法一:保留两位小数 function keepTwoDecimal(num) { var result = ...
- 从代码到产品,我的IT职业成长之路
每个人的职业生涯都是一段充满转折和挑战的旅程,当然每一次职业转型都是一次重新定义自己的机会,从2015年开始,当时我刚踏入IT行业,成为一名Java开发者,后来随着时间的推移,我的职业方向逐渐转向了前 ...
- WiFi基础(二):最新WiFi信道、无线OSI模型与802.11b/g/n
liwen01 2024.09.01 前言 最近十几年,通信技术发展迅猛,通信标准更新频繁,有的设备还在使用 802.11/b/g/n 协议,有的已支持到 WiFi6.WiFi7. 而国内有关无线 W ...
- git重命名文件夹
在源代码文件夹中打开git bash, 不同名称的文件夹命令: 1. git mv A An 3. git add -u An 4. git commit -m "重命名A为An&quo ...
- VC 单文档FormView视图增加打印预览
1修改my.rc文件二处 3 TEXTINCLUDE BEGIN "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO ...
- 痞子衡嵌入式:如果i.MXRT离线无法启动,试着分析ROM启动日志
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT系列MCU的ROM启动日志. 关于 i.MX RT 启动问题解决的文章,痞子衡写过非常多,其中大部分都是具体到某一类启 ...