跳到主要内容

标签下载

一、同源 URL 下载


function download(url,name){
const a = document.createElement("a");

a.setAttribute("href",url);
a.setAttribute("target","_blank");
a.setAttribute("download",name);

document.body.appendChild(a);

a.click();
a.remove();
}

二、跨域 URL 下载


a 标签的 download 属性具有一定的限制,仅适用于同源 URL 。如果是跨域 URL , 那么 a 标签的下载行为变成了另起 Tab 打开文件了。所以,我们需要将跨域 URL 转换成 blob 的形式才可以下载。

async function transformBlobByUrl(url){
const response = await fetch(url);
const blob = await response.blob();
return URL.createObjectURL(blob);
}

async function download(url,name){
const link = document.createElement("a");
const blob = await transformBlobByUrl(url);
link.href = URL.createObjectURL(blob);
link.download = name;
link.click();
link.remove();
URL.revokeObjectURL(link.href);
}

三、https & http 下载


如果在 https 环境下,通过 a 标签下载 URL 地址为 http 的文件,会出现拦截或者闪一下的情况。浏览器会认为在 https 下打开的 http 链接不是人为的,所以会进行拦截,或者访问不成功。 所以,我们需要将把目标链接改成 https 的,不管前端还是后端

function httpToHttps(url){
const httpReg = /^http(\:\/\/.*)/;
return url.replace(httpReg,"https$1");
}

function download(url,name){
const a = document.createElement("a");
const urlCopy = httpToHttps(url);


a.setAttribute("href",urlCopy);
a.setAttribute("target","_blank");
a.setAttribute("download",name);

document.body.appendChild(a);

a.click();
a.remove();
}