根据讨论 blob:
,data:
URL 不受影响,因此这里是使用fetch
Blob的解决方法。
客户端强制下载媒体
function forceDownload(blob, filename) {
var a = document.createElement('a');
a.download = filename;
a.href = blob;
// For Firefox https://stackoverflow.com/a/32226068
document.body.appendChild(a);
a.click();
a.remove();
}
// Current blob size limit is around 500MB for browsers
function downloadResource(url, filename) {
if (!filename) filename = url.split('\\').pop().split('/').pop();
fetch(url, {
headers: new Headers({
'Origin': location.origin
}),
mode: 'cors'
})
.then(response => response.blob())
.then(blob => {
let blobUrl = window.URL.createObjectURL(blob);
forceDownload(blobUrl, filename);
})
.catch(e => console.error(e));
}
downloadResource('https://giant.gfycat.com/RemoteBlandBlackrussianterrier.webm');
但是,fetch 仅适用于某些 URL。您可能会收到 CORS 错误:
Failed to load https://i.redd.it/l53mxu6n14o01.jpg: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://redditp.com' is therefore not allowed access.
有一些扩展程序可让您拦截和修改或删除网站的安全标头:
ModHeader - Chrome 网上应用店
(但设置Access-Control-Allow-Origin: *
对我来说破坏了 YouTube)
表现
请注意,这种方法的性能不是很好!有时我的下载会停滞 <1 分钟。不过,页面的其余部分在这段时间内是响应式的。我没有研究过这个,但我认为创建大型 Blob 是资源密集型的。
暴力猴子 / 篡改猴子
如果您的用例是用户脚本,则有 GM_download(options), GM_download(url, name)
⚠ 在 Tampermonkey 中这是一个测试版功能,您必须首先在Tampermonkey Dashboard > Settings 中设置下载模式: [Browser API ▾]