我无法使用 Chrome 扩展程序中的 chrome.downloads API 停止小文件下载

问题描述 投票:0回答:2

我试图在 Chrome 扩展清单版本 3 中结束(并在进行一些分析后重新启动)文件下载之前停止。我使用 chrome.downloads.OnDeterminingFileName 和 chrome.downloads.OnCreated 事件来检测下载何时开始,然后检测第一个下载我的代码在该事件处理程序中执行的操作是使用 chrome.downloads.pause 方法来停止下载。 添加:

        chrome.downloads.onDeterminingFilename.addListener(function (downloadItem) {
        
        if(downloadItem.fileSize < 20971520 && downloadItem.filename.endsWith('.exe') ){

        chrome.downloads.pause(downloadItem.id);
        console.log(downloadItem.id)

        }
});

问题是它无法处理小文件(小于 1MB),因为它正在下载。对于更大的,它工作得很好。我可以做些什么来解决这个问题吗?我可以避免这种行为吗? 预先感谢。

google-chrome-extension
2个回答
2
投票

我可以重现该问题,但我没有解决方案。

chrome.downloads.on确定文件名

If the listener calls suggest asynchronously, then it must return true.
The DownloadItem will not complete until all listeners have called suggest.

因此,以下代码应该自动暂停所有下载。

manifest.json

{
    "manifest_version": 3,
    "name": "Pause Downloads",
    "version": "0.0.1",
    "action": {
    },
    "background": {
        "service_worker": "background.js"
    },
    "permissions": [
        "downloads"
    ]
}

背景.js

function onChanged(downloadDelta) {
    console.log("onChanged", downloadDelta);
}

function onCreated(downloadItem) {
    console.log("onCreated", downloadItem);
}

function onDeterminingFilename(downloadItem, suggest) {
    console.log("onDeterminingFilename", downloadItem, suggest);
    
    chrome.downloads.pause(downloadItem.id)
    .then(function() {
        suggest();
    })
    .catch(function(error) {
        console.error("background.js", "onDeterminingFilename", error);
        suggest();
    });
    return true;
}

chrome.downloads.onChanged.addListener(onChanged);
chrome.downloads.onCreated.addListener(onCreated);
chrome.downloads.onDeterminingFilename.addListener(onDeterminingFilename);

我使用 https://fastest.fish/test-files 来测试不同文件大小的下载。

但正如你所说,扩展程序仅暂停> = 1 MB 的下载。

当我下载 1 KB 文件时,扩展程序会记录:

  1. onCreated:状态=进行中
  2. onDeterminingFilename:状态=进行中
  3. onChanged:暂停= true
  4. onChanged:文件大小= 1000
  5. onChanged:状态=完成

换句话说:扩展程序暂停下载,但 Chrome 会忽略这一点并完成下载。

如果其他人没有解决方案,您可能应该将此报告为错误,并链接到问题中的错误报告。


0
投票

@Thomas Mueller 听起来是对的。但是,只是补充一下,与 chrome 不同,我尝试暂停多个文件的下载,即使对于大小为 1 字节的文件也是如此。 Firefox,似乎在所有情况下都运行良好。


function onPaused(downloadId) {
    console.log(`Paused download`);
    const myTimeout = setTimeout(() => {
        let resuming = browser.downloads.resume(downloadId)
        resuming.then( (res) => {
            console.log({ res })
        }, (err) => console.error( err ) )

    }, 3000);
}
  
function onError(error) {
    console.log(`Error: ${error}`);
}
  
// DETECTING DOWNLOAD 
function handleCreated(downloadItem) {
    const downloadId = downloadItem?.id
    
    let pausing = browser.downloads.pause(downloadId);
    pausing.then(() => onPaused(downloadId) , onError);
}
browser.downloads.onCreated.addListener(handleCreated);
© www.soinside.com 2019 - 2024. All rights reserved.