使用chrome.downloads从通过chrome.webRequest找到的URL下载文件?

时间:2016-10-16 21:23:56

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

我的最终目标是从网站下载文件。不幸的是,当您单击按钮时,包含URL的页面会通过JavaScript获取下载URL。因此,我无法从HTML中提取网址。

现在,我点击按钮时使用Chrome应用和chrome.webRequest.onCompleted.addListener获取网址,然后将该网址传递到chrome.downloads.download以下载文件。

问题在于这会创建一个无限循环,因为使用URL运行chrome.download只会再次触发chrome.webRequest。有人可以帮我解决这个鸡肉或鸡蛋问题吗?这是代码:

manifest.json

{
  "name": "Chrome test",
  "version": "0.1",
  "description": "A download test",
  "manifest_version": 2,
  "permissions": [
    "webRequest", "*://*.theSite.com/",
    "downloads"
  ],
  "background": {
    "scripts": ["backgroundjs.js"],
    "persistent": true
  }
}

这里是背景javascript:

backgroundjs.js

chrome.webRequest.onCompleted.addListener(function(details){
  var fileurl = details.url;
  chrome.downloads.download({
    url: fileurl
  })

},
{urls: ["*://*.theSite.com/KnownGeneralPathOfFile/*"]});

1 个答案:

答案 0 :(得分:1)

有多种方法可以完成您想要做的事情。立即想到的几种不同的方法是:

  1. 保留已开始下载的网址列表,不要再启动任何与网址列表中的网址匹配的网址。
  2. 根据传递给details侦听器的webRequest对象的属性区分您的操作。对于下载,似乎是details.tabId===-1details.type==='other'。因此,当满足这两个条件时,您可能无法开始下载。
  3. 保留要从下载中排除的网址列表(再次):
    鉴于您正在下载的每个网址只启动了一个webRequest,您可以选择在找到一次匹配后将URL保留在列表中,或者在第一次匹配后将其删除。如果在第一次匹配后将其删除,则只会阻止当前下载生成的webRequest再次下载。如果您选择将URL保留在列表中,则不会下载相同的URL两次。就个人而言,我希望您的用户通常更愿意每次会话只下载一次网址。但是,这个选择取决于您,或者可能是您允许用户选择的首选项。

    以下是一个扩展程序,它实现了保留要从下载中排除的URL列表。就像在这里一样,每个URL只保留到第一次找到。这将阻止下载webRequest导致启动另一次下载。如果您只想下载一次网址,请注释掉或删除splice行。

    background.js

    var excludedWebRequestDownloadUrls=[];
    chrome.webRequest.onCompleted.addListener(function(details){
        let fileUrl = details.url;
        let foundIndex = excludedWebRequestDownloadUrls.indexOf(fileUrl);
        if(foundIndex>-1){
            //Remove the found item (only one webRequest is executed for the download).
            //  May want to not remove the URL from the list of excluded URLs, as you probably
            //  only want to download the same URL once, not multiple times.
            excludedWebRequestDownloadUrls.splice(foundIndex,1);
            //Don't try to download the found URL again.
            return;
        }
        //Remember the URL which we are going to download.
        excludedWebRequestDownloadUrls.push(fileUrl);
        chrome.downloads.download({
            url: fileUrl
        });
    },{urls: ["*://*.stackoverflow.com/questions/*"]});
    

    的manifest.json

    {
      "name": "Chrome test",
      "version": "0.1",
      "description": "A download test",
      "manifest_version": 2,
      "permissions": [
        "webRequest", "*://*.stackoverflow.com/",
        "downloads"
      ],
      "background": {
        "scripts": ["background.js"],
        "persistent": true
      }
    }
    

    上述代码已在Chrome和Firefox中进行了测试。