How to force Chrome to NOT open SaveAs Dialog when downloading a URL?
Chrome版本:最新的33+
Chrome扩展程序从当前查看的网站中提取某些网址,然后下载其中的一部分(通常为数百个文件)。
预期行为:
文件被下载到默认的"下载文件夹"中,而无需询问文件的保存位置和文件名。
问题:
如果用户在Chrome->设置->高级设置->下载中启用了"在下载前先询问保存每个文件的位置"选项,则在尝试同时下载(例如100个文件)时,Chrome尝试打开100个"另存为"对话框,然后 崩溃。
我试过的
- 使用带有选项saveAs的chrome.downloads.download(对象选项,函数回调)方法:false
-
使用以下代码通过模拟的mousevent触发下载:
1
2
3
4
5
6
7
8
9
10
11function 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);
}
编辑:我为多个文件下载添加了完整的示例代码,其中没有显示"另存为"对话框。
您可以使用chrome.downloads API来实现。
manifest.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "description":"Multiple file downloads without showing SaveAs Dialog", "background": { "scripts": ["background.js" ], "persistent" : true }, "content_scripts": [{ "js": ["content_script.js"], "matches": ["" ], "run_at":"document_start" }], "manifest_version": 2, "name":"MultipleFileDownloads", "permissions": ["downloads" ], "short_name":"MFD", "version":"0.0.0.1" } |
content_script.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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); }) } |
background.js
1 2 3 4 5 6 7 8 9 | 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开始)。 相应的Chromium错误是:
错误417112:chrome.downloads.download忽略saveAs
此外,在
错误758094:扩展名无法重命名下载的文件