1. 通过点击下载多媒体文件 (图片 / 视频 / 文件等)
-
最简单的方式:
<a href='url' download="filename.ext"> 下载文件 </a>
- 如果 url 指向同源资源,是正常的。
-
如果 url 指向第三方资源,download 会失效,表现和不使用 download 时一致——浏览器能打开的文件,浏览器会直接打开,不能打开的文件,会直接下载。浏览器打开的文件,可以手动下载。
- 解决方案一:将文件打包为.zip/.rar 等浏览器不能打开的文件下载。
- 解决方案二:通过后端转发,后端请求第三方资源,返回给前端,前端使用 file-saver 等工具保存文件。
- 如果 url 指向的第三方资源配置了 CORS,download 属性无效,但可以获取文件下载到本地,无法修改修改文件名。
2. 解决方法
1. 借助 HTML5 Blob 实现文本信息文件下载
const downloadRes = async (url, name) => {let response = await fetch(url)
// 内容转变成 blob 地址
let blob = await response.blob()
// 创建隐藏的可下载链接
let objectUrl = window.URL.createObjectURL(blob)
let a = document.createElement('a')
// 地址
a.href = objectUrl
// 修改文件名
a.download = name
// 触发点击
document.body.appendChild(a)
a.click()
// 移除
setTimeout(() => document.body.removeChild(a), 1000)
}
2. 图片格式
如果我们想下载一张图片,可以把这张图片转换成 base64 格式,然后下载。```
export const downloadImg = async (url, name) => {var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function() {
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img, 0, 0);
var dataURL = canvas.toDataURL('image/png');
let a = document.createElement('a');
a.href = dataURL;
a.download = name;
document.body.appendChild(a);
a.click();
setTimeout(() => {document.body.removeChild(a);
canvas = null;
}, 1000);
};
img.src = url;
};
```