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.downloadsAPI会失败。示例权限配置:{ "permissions": ["downloads"] } - Firefox扩展中建议统一使用
browser命名空间,错误处理改用browser.runtime.lastError,保持API一致性。
内容的提问来源于stack exchange,提问作者mirko sailorm
相关产品推荐
相关产品推荐

