You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firefox扩展popup.js中调用browser.downloads.download() API下载失败

问题分析与修复方案

你的下载失败有两个关键问题:

  • 硬编码URL错误:你在browser.downloads.download的配置里写了url: "url",这是把字符串"url"当作下载地址,而非你生成的Blob URL变量url。浏览器尝试下载这个无效地址,自然会失败。
  • URL回收时机过早:调用下载API后立刻执行URL.revokeObjectURL(url),此时下载操作可能还未完成,Blob URL就被回收,导致下载过程中找不到资源。

修复后的代码

function download() {
  const blob = new Blob(["smssjsjssjsj"], { type: "text/plain" });
  const url = URL.createObjectURL(blob);

  browser.downloads.download(
    {
      url: url, // 使用变量url,而非字符串"url"
      filename: `xxxa.txt`,
      saveAs: false,
    },
    (downloadId) => {
      if (browser.runtime.lastError) {
        errmessage.innerText = "Download failed:" + browser.runtime.lastError.message;
        URL.revokeObjectURL(url); // 下载失败时回收URL
      } else {
        // 监听下载完成事件,完成后再回收URL
        browser.downloads.onChanged.addListener(function listener(delta) {
          if (delta.id === downloadId && delta.state?.current === "complete") {
            URL.revokeObjectURL(url);
            browser.downloads.onChanged.removeListener(listener); // 移除监听避免内存泄漏
          }
        });
      }
    }
  );
}

额外注意事项

  • 确保扩展已在manifest.json中声明"downloads"权限,否则调用browser.downloads API会失败。示例权限配置:
    {
      "permissions": ["downloads"]
    }
    
  • Firefox扩展中建议统一使用browser命名空间,错误处理改用browser.runtime.lastError,保持API一致性。

内容的提问来源于stack exchange,提问作者mirko sailorm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:44:57