目录
一、主要步骤
二、本地下载
三、远程下载
四、多个下载
一、主要步骤
主要通过标签来实现,将要下载的文件链接设置为href属性,将文件名设置为download属性,然后模拟点击这个链接即可触发下载。
本文简单例举了几种下载方式,只是完成下载的任务,具体细节和精确控制还请查看官方文档。
二、本地下载
1.本地比较简单,可以直接使用 a 标签
最简单的方式是:
herf为图片路径,download为设置下载文件名字
如果不想让 a 标签显示出来,可以创建隐藏的a标签,通过其他点击事件去触发下载:
(这里 download() 函数 return 一个function是因为需要在 addEventListener 的回调函数里传递参数)
// 获取button标签
const bt = document.querySelector('button')
// 给button添加点击事件 注意这里换成自己的路径
bt.addEventListener('click',download('/1695208099339.jpg','img.jpg'))
function download(url,fileName){
return function(){
// 创建a标签
var link = document.createElement('a');
// 设置a标签为不可见
link.style.display = 'none';
// 将a标签添加到body
document.body.appendChild(link);
// 设置a标签的href
link.href = url;
// 设置a标签的download
link.download = fileName;
// 模拟点击事件进行下载
link.click();
// 下载完成后移除a标签
document.body.removeChild(link);
}
}
三、远程下载
在开发中,我们往往获取的是服务器上的图片,得到的只有图片的url地址,此时如果继续采用上面的方法会发现无法下载,变成了预览图片。这里我们需要使用 fetch 来请求获取图片,然后将其转为 Bold 对象,通过该对象生成 Blob URL,这个url才是可以下载时使用的:
const srcList = [
'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
]
// 获取button标签
const bt = document.querySelector('button')
// 给button添加点击事件
bt.addEventListener('click',download(srcList[0],'img.jpg'))
function download(url,fileName){
return function(){
//图片的地址
fetch(url)
// 获取 blob 对象
.then(res=>res.blob())
.then(blob=>{
// 创建a标签
var link = document.createElement('a');
// 设置a标签为不可见
link.style.display = 'none';
// 将a标签添加到body
document.body.appendChild(link);
// 生成Blob URL并设置给a标签的href属性
var url = window.URL.createObjectURL(blob);
link.href = url;
// 设置a标签的download
link.download = fileName;
// 模拟点击事件进行下载
link.click();
//下载完成后清理URL对象和a标签
window.URL.revokeObjectURL(url);
document.body.removeChild(link);
})
}
}
四、多个下载
前端下载的实际操作是由浏览器来处理的。当用户点击下载链接或者通过JavaScript触发文件下载时,浏览器会负责发起文件下载请求,并将文件保存到用户的本地计算机中。浏览器会处理文件下载的所有细节,包括网络请求、接收文件数据、保存文件等操作。
所以一般情况下,我们要下载多个文件,只需要循环向浏览器提交下载任务就可以了。
const srcList = [
'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
]
// 获取button标签
const bt = document.querySelector('button')
// 给button添加点击事件
bt.addEventListener('click',downloadMany(srcList))
//下载多个
function downloadMany(srcList){
return function() {
srcList.forEach((url,index)=>{
//循环调用download函数下载
download(url,index+'png')
})
}
}
//下载函数
function download(url,fileName){
//图片的地址
fetch(url)
// 获取 blob 对象
.then(res=>res.blob())
.then(blob=>{
// 创建a标签
var link = document.createElement('a');
// 设置a标签为不可见
link.style.display = 'none';
// 将a标签添加到body
document.body.appendChild(link);
// 生成Blob URL并设置给a标签的href属性
var url = window.URL.createObjectURL(blob);
link.href = url;
// 设置a标签的download
link.download = fileName;
// 模拟点击事件进行下载
link.click();
//下载完成后清理URL对象和a标签
window.URL.revokeObjectURL(url);
document.body.removeChild(link);
})
}
注意:URL.createObjectURL 生成的url如果过多会有效率问题,可以在合适的时机(download后)释放掉。
推荐链接
发表评论