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

移动端Firefox下Tampermonkey脚本避免重复下载文件问询

解决移动端Firefox+Tampermonkey重复下载文件的问题

我刚好碰到过类似的场景,给你几个亲测可行的解决思路,适配移动端Firefox的环境:

方案1:直接覆盖已存在文件(最简单高效)

Tampermonkey的GM_download其实自带了overwrite参数,开启后下载同名文件时会直接覆盖原文件,不会生成Hello(1).txt这类重复版本。需要注意两个点:

  • 脚本元数据里必须声明@grant GM_download(一般用这个方法的脚本都会默认添加)
  • 首次运行时移动端Firefox可能会弹出权限请求,允许脚本修改本地文件即可

代码示例:

// 替换为你的目标URL和文件名
const targetUrl = "https://example.com/Hello.txt";
const saveName = "Hello.txt";

GM_download({
    url: targetUrl,
    name: saveName,
    overwrite: true, // 关键:开启覆盖模式
    onload: () => console.log("文件下载/覆盖完成"),
    onerror: (err) => console.error("下载失败:", err)
});

方案2:用Tampermonkey存储记录已下载文件(避免重复请求)

如果不想覆盖文件,而是完全跳过已下载的内容,可以用Tampermonkey的GM_getValue和GM_setValue做本地记录。这种方法不需要访问本地文件系统,靠脚本自身的存储来判断:

代码示例:

const targetUrl = "https://example.com/Hello.txt";
const saveName = "Hello.txt";
// 用文件名作为唯一标识,也可以用URL保证唯一性
const recordKey = `downloaded_${saveName}`;

// 先检查是否已经标记过下载
if (GM_getValue(recordKey, false)) {
    console.log(`文件${saveName}已下载过,跳过`);
    alert(`文件${saveName}已存在,无需重复下载`);
} else {
    GM_download({
        url: targetUrl,
        name: saveName,
        onload: () => {
            console.log("文件下载成功");
            // 标记为已下载
            GM_setValue(recordKey, true);
        },
        onerror: (err) => console.error("下载失败:", err)
    });
}

⚠️ 提示:如果用户手动删除了下载目录里的文件,脚本还是会认为已经下载过,所以更适合那种一旦下载就无需更新的文件。

方案3:利用浏览器Downloads API检测本地真实文件状态

如果需要准确判断本地下载目录里是否真的存在该文件,可以使用浏览器的downloads API。不过需要满足几个前提:

  1. 在脚本元数据里添加@grant browser.downloads
  2. 移动端Firefox需要允许脚本访问下载记录权限
  3. 该API会搜索浏览器记录中仍然存在的文件(区分已删除和未删除的下载文件)

代码示例:

const targetUrl = "https://example.com/Hello.txt";
const saveName = "Hello.txt";

// 异步检测文件是否存在
async function checkLocalFile() {
    try {
        const matchedDownloads = await browser.downloads.search({
            filename: saveName,
            exists: true // 只筛选仍然存在的文件
        });
        return matchedDownloads.length > 0;
    } catch (err) {
        console.error("检测文件失败:", err);
        return false;
    }
}

// 先检测再执行下载
checkLocalFile().then(exists => {
    if (exists) {
        console.log(`文件${saveName}已存在,跳过下载`);
        alert(`文件${saveName}已存在`);
    } else {
        GM_download({
            url: targetUrl,
            name: saveName,
            onload: () => console.log("文件下载成功")
        });
    }
});

⚠️ 提示:部分移动端浏览器对downloads API的支持有限,如果这个方法不生效,优先选择方案1或方案2。

另外你提到的用XMLHttpRequest访问file://协议文件,浏览器出于安全限制是完全禁止的,所以这条路走不通,上面的方案都是绕开这个限制的可行方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:32:41