关于javascript:下载网址时,如何强制Chrome浏览器不打开“另存为”对话框?

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
    11
    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);
    }


编辑:我为多个文件下载添加了完整的示例代码,其中没有显示"另存为"对话框。

您可以使用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

此外,在chrome.downloads.downloads()中设置文件名也不起作用。

错误758094:扩展名无法重命名下载的文件