点击a标签下载当前链接的图片&&js 通过 blob 类文件对象下载图片,修改图片保存的名字(兼容式写法)...

若想点击a标签就下载当前链接的图片,首先必须文件是同源的,在a标签上增加download属性,才能触发点击下载的效果,若不同源的话则变成在当前页面打开该图片了。

若想要下载不同源的文件,有一种思路是将图片转为base64再赋值给a标签,这样点击后应该就能够下载了

问题:通过a标签下载图片,只有谷歌浏览器和火狐浏览器才支持


通过iframe的方式下载图片的时候,不能够修改图片的名字。
解决思路:

1、因为图片地址是跨域的,所以先要转成 base64 数据流

2、然后把 base64 转换成 blob对象

3、然后判断浏览器的类型,选择不同的方式把 blob 文件流下载到本地

 转换成base64的方法

convertUrlToBase64(url) {
return new Promise(function(resolve, reject) {
var img = new Image();
img.crossOrigin = "Anonymous";
img.src = url;
img.onload = function() {
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, img.width, img.height);
var ext = img.src
.substring(img.src.lastIndexOf(".") + 1)
.toLowerCase();
var dataURL = canvas.toDataURL("image/" + ext);
var base64 = {
dataURL: dataURL,
type: "image/" + ext,
ext: ext
};
resolve(base64);
};
});
},


 转换成 blob 对象

convertBase64UrlToBlob(base64) {
var parts = base64.dataURL.split(";base64,");
var contentType = parts[0].split(":")[1];
var raw = window.atob(parts[1]);
var rawLength = raw.length;
var uInt8Array = new Uint8Array(rawLength);
for (var i = 0; i < rawLength; i++) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], { type: contentType });
},


 判断浏览器的类型

myBrowser() {
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
if (userAgent.indexOf("OPR") > -1) {
return "Opera";
} //判断是否Opera浏览器 OPR/43.0.2442.991
if (userAgent.indexOf("Firefox") > -1) {
return "FF";
} //判断是否Firefox浏览器  Firefox/51.0
if (userAgent.indexOf("Trident") > -1) {
return "IE";
} //判断是否IE浏览器 Trident/7.0; rv:11.0
if (userAgent.indexOf("Edge") > -1) {
return "Edge";
} //判断是否Edge浏览器 Edge/14.14393
if (userAgent.indexOf("Chrome") > -1) {
return "Chrome";
} // Chrome/56.0.2924.87
if (userAgent.indexOf("Safari") > -1) {
return "Safari";
} //判断是否Safari浏览器 AppleWebKit/534.57.2 Version/5.1.7 Safari/534.57.2
},


 把获取的地址传入上面的方法,然后判断浏览器的类型,
选择兼容的下载 blob 文件流的方法

//图片格式和PDF
this.convertUrlToBase64(url).then(function(base64) {
// 图片转为base64
var blob = that.convertBase64UrlToBlob(base64); // 转为blob对象
// 下载
if (that.myBrowser() == "IE") {
window.navigator.msSaveBlob(blob, name + ".jpg");
} else if (that.myBrowser() == "FF") {
window.location.href = url;
} else {
var a = document.createElement("a");
a.download = name;
a.href = URL.createObjectURL(blob);
a.click();
}
});


————————————————
版权声明:本文为CSDN博主「时间飞逝子非鱼」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lgysjfs/article/details/88644837

Vue3本身是一个前端框架,用于构建用户界面,但它并不直接提供处理HTTP请求的下载功能。然而,在使用Vue配合axios库进行后端通信时,可以结合其他JavaScript特性来实现文件下载。 1. **responseType: "blob"** - 这是在axios的拦截器或响应处理函数中,当服务器返回二进制数据时,你可以设置`responseType: 'blob'`,然后转换成Blob对象,再利用FileSaver库将Blob转为文件下载。示例: ```javascript axios.get('/file', { responseType: 'blob' }) .then(response => { const url = URL.createObjectURL(response.data); const aLink = document.createElement('a'); aLink.href = url; aLink.download = 'filename'; aLink.click(); }); ``` 2. **a标签download属性** - 可以创建一个新的`<a>`元素,设置其`href`为服务器提供的下载链接,加上`download`属性指定文件名,模拟点击下载。例如: ```javascript const blobUrl = URL.createObjectURL(response.blob()); const link = document.createElement('a'); link.href = blobUrl; link.download = 'filename'; link.click(); ``` 3. **axios.post请求写法** - 使用axios的POST请求获取文件流,同样设置`responseType: 'blob'`。如果后端支持,可以在API响应头中添加`Content-Disposition`字段指示下载。例如: ```javascript axios.post('/download', {}, { responseType: 'blob' }).then((response) => { // 同上,处理Blob对象 }); ``` 4. **引入JS方法文件** - 可能是指引入专门处理文件下载的库,如`js-file-download`或`file-saver`。首先安装库,然后导入并使用它们提供的API来下载文件。 5. **try...catch和async/await** - 当处理网络请求时,通常会用到这两个结构来处理可能出现的错误。例如: ```javascript async function downloadFile() { try { const response = await axios.get('/file', { responseType: 'blob' }); // ... 文件下载逻辑 } catch (error) { console.error('Download failed:', error); } } ``` 以上就是在Vue3中结合axios进行文件下载的不同方法,以及处理错误的基本思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值