如何在内容脚本中使用chrome.download?

时间:2018-07-17 23:52:40

标签: javascript google-chrome google-chrome-extension content-script

我正在尝试使用chrome.download方法下载CSV文件类型,并在下载后更改文件名。

当前,我正在使用

document.querySelectorAll("[file$='foo']").forEach(a=>a.click());

模拟对要下载的每个元素的单击。但是,下载时的每个文件名都是foo.csv,foo(1).csv等。最后,我想下载文件并更改文件名。目前,我是通过内容脚本来执行此操作的,并且从我拥有的read中我无法访问chrome.download API,必须使用我的background.js消息传递。

根据我的理解,与此类似的其他帖子涉及创建一个新的元素/内容进行下载,而不是下载该站点上已有的内容。

Example Example 2

任何帮助将不胜感激!谢谢!!

我的background.js

function changeName(prevName){
    chrome.downloads.onDeterminingFilename.addListener((prevName, suggest) => {
        suggest({
            filename: 'new-name.csv'
          });
        });
    };

chrome.runtime.onMessage.addListener(function(msg, sender) {
    if ((msg.action === 'renameSave')
            && (msg.params !== undefined)) {
        changeName(msg.params);
    };
});

和我的contentscript.js

 button.addEventListener('click', function() {
    var elems = document.getElementsByClassName("Stmt");
    var count = 1;


    var interval = setInterval(function(){
      elems[count].click();

      chrome.runtime.sendMessage({
        action: 'renameSave',
        params: ["statement.csv"]
      });

      count = count + 2;
      if(count > elems.length){
            clearInterval(interval);
        }

  },800);
}, false);

2 个答案:

答案 0 :(得分:0)

这不是问题。有chrome.downloads事件onDeterminingFilename,它有助于“建议”下载项目的文件名。该API可用于后台页面:

  1. 创建一个名为“ background.js”的文件
  2. 将其引用放入清单中。
"background": {
    "scripts": ["background.js"],
}
  1. 向清单部分添加“下载”权限
  2. 此代码正在执行您想要的操作:
chrome.downloads.onDeterminingFilename.addListener((item, suggest) => {
    // "item.filename" - the current filename
    suggest({
        filename: 'new-name.csv'
    });
});

答案 1 :(得分:0)

您可以在侦听器函数中放置一个变量,而不是const字符串(文件名:fileNameVar ):

function changeName(prevName){
chrome.downloads.onDeterminingFilename.addListener((prevName, suggest) => {
    suggest({
        filename: fileNameVar
      });
    });
};

chrome.runtime.onMessage.addListener(function(msg, sender) {
    if ((msg.action === 'renameSave')
            && (msg.params !== undefined)) {
        changeName(msg.params);
    };
});

这样,您可以每次使用全局变量或chrome.storage API来更改fileName。