【问题标题】:How do I use chrome.download within my content script?如何在我的内容脚本中使用 chrome.download?
【发布时间】:2018-12-25 18:19:31
【问题描述】:

我正在尝试使用 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

非常感谢任何帮助!谢谢!!

我的背景.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);

【问题讨论】:

  • 链接元素应该有一个download 属性,其中指定了文件名。这是你唯一可能缺少的东西,AFAIK。

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


【解决方案1】:

这不是问题。有 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'
    });
});

【讨论】:

  • 我将您的建议用于消息传递,这看起来如何?
  • @Tnellis onDeterminingFilename 是一个事件监听器,一旦你运行它 - 它会监听每个新的下载操作。您不需要在内容脚本中的每条消息上都设置它。
  • 每个下载名称都是唯一的,我打算通过消息传递来实现这一点。这是正确的逻辑,还是我把它复杂化了?
  • 没关系,但是如果你为每条消息设置了一个监听器,别忘了通过chrome.downloads.onDeterminingFilename.removeListener删除它
【解决方案2】:

您可以在侦听器函数中放置一个变量,而不是一个 const 字符串 (filename: 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 更改文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 2013-11-24
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多