Javascript 下载URL时如何强制Chrome不打开SaveAs对话框?
Chrome Build:最新版本,33+ Chrome扩展从当前查看的站点提取某些URL,然后下载其中的一个子集(通常是数百个文件) 预期行为: 文件被下载到默认的下载文件夹,而无需询问文件保存的位置和文件名 问题: 如果用户在Chrome->Settings->Advanced Settings->Downloads中启用了选项“下载前询问每个文件的保存位置”,那么当试图同时下载100个文件时,Chrome会尝试打开100个SaveAs对话框并崩溃 我的尝试:Javascript 下载URL时如何强制Chrome不打开SaveAs对话框?,javascript,google-chrome,google-chrome-extension,download,Javascript,Google Chrome,Google Chrome Extension,Download,Chrome Build:最新版本,33+ Chrome扩展从当前查看的站点提取某些URL,然后下载其中的一个子集(通常是数百个文件) 预期行为: 文件被下载到默认的下载文件夹,而无需询问文件保存的位置和文件名 问题: 如果用户在Chrome->Settings->Advanced Settings->Downloads中启用了选项“下载前询问每个文件的保存位置”,那么当试图同时下载100个文件时,Chrome会尝试打开100个SaveAs对话框并崩溃 我的尝试: 将chrome.downlo
- 将chrome.downloads.download(对象选项、函数回调)方法与选项saveAs:false一起使用
- 使用以下代码通过模拟mousevent触发下载:
function saveAs(Url,filename){ var blob=new Blob([''], {type:'application/octet-stream'}); var url = webkitURL.createObjectURL(blob); var a = document.createElementNS('http://www.w3.org/1999/xhtml','a'); a.href = Url; a.download = filename; var e = document.createEvent('MouseEvents'); e.initMouseEvent('click', false, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(e); webkitURL.revokeObjectURL(url); }
{
"description": "Multiple file downloads without showing SaveAs Dialog",
"background": {
"scripts": [ "background.js" ],
"persistent" : true
},
"content_scripts": [{
"js": [ "content_script.js"],
"matches": [ "<all_urls>" ],
"run_at": "document_start"
}],
"manifest_version": 2,
"name": "MultipleFileDownloads",
"permissions": [ "downloads" ],
"short_name": "MFD",
"version": "0.0.0.1"
}
background.js
var DOWNLOAD_LIMIT = 100;
function downloadURL(url, filename, callback){
chrome.runtime.sendMessage({
download_url : url,
filename : filename
},function(){
if(typeof callback == 'function'){
callback();
}
})
}
function simulateFileDownload(i){
if(i > DOWNLOAD_LIMIT){
document.getElementById('download_btn').disabled = false;
return false;
}
var blob = new Blob(['This is sample file '+i], {type:'text/plain'});
var url = URL.createObjectURL(blob);
downloadURL(url,'Sample-'+i+'.txt',function(){
URL.revokeObjectURL(url);
i++;
simulateFileDownload(i);
})
}
window.onload = function(){
var btn = document.createElement('button');
btn.id = 'download_btn';
btn.style.cssText = 'position:fixed;top:10px;left:10px;width:140px;height:30px;z-index:1000000;';
btn.textContent = 'Download Files';
document.body.appendChild(btn);
btn.addEventListener('click',function(){
this.disabled = true;
simulateFileDownload(0);
})
}
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){
if(message.download_url){
chrome.downloads.download({
url : message.download_url,
filename : message.filename,
saveAs : false
}
}
});
启用“下载前询问保存每个文件的位置”时(从70.0.3538.77起)是不可能的。相应的铬错误是:
此外,在chrome.downloads.downloads()
中设置文件名也不起作用
我从未使用过chrome扩展,但根据以前在chrome中使用应用程序的经验,用户定义的首选项始终优先于应用程序行为。如果允许应用程序覆盖用户明确单击的内容,这将是一个安全漏洞。您是否可以将这些内容发布到服务,让它生成zip,返回URL或b64,然后下载该zip?然后,只有一个弹出窗口?说什么我完全理解你的想法,但没有人,它似乎更充分地通知用户,它所需要的是取消选中一个设置或不尝试一次下载100个项目,而不是强迫用户在每次下载后解压。此外,这种行为是违反直觉的,因此无论如何都必须通知用户。我认为必须有一个更优雅的解决方案。它可能是一个错误,它会弹出另存为对话框,即使具有
下载
权限的扩展名说不可以。将一个bug提交到?我已经在最新版本(35.0.1897.2 dev-m)上进行了检查-看起来您是对的,这是一个bug。这两种方法都能如期工作。你能把你的答案作为实际答案而不是评论吗?这样我就可以把它标记为正确答案。你能分享你的全部例子吗。我无法安装您的共享crx。您好,请共享源代码。我必须在chrome应用程序中实现下载功能。在Windows 7上的chrome v53中,即使使用此示例,也始终会显示“另存为”对话框。顺便说一下,您有一个输入错误:background.jsmessage.url
应该是message.download\u url
。