You need to enable JavaScript to run this app. Eel应用中通过JS在Chrome浏览器触发下载仅能生效一次问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Eel应用中通过JS在Chrome浏览器触发下载仅能生效一次问题求助

问题根因

这是Eel框架对Chrome浏览器内置的data URI请求存在拦截缓存逻辑导致的:Eel会拦截所有Chrome窗口内的资源请求,首次设置的data URI可以正常通过路由校验,第二次复用同一个<a>标签更新href属性时,Eel的缓存逻辑没有正确识别更新后的data URI,直接拦截了下载请求,就会出现Chrome显示下载提示但最终没有文件生成的问题。Edge的请求处理逻辑和Chrome有差异,无Eel拦截的纯浏览器环境也不会触发这个逻辑,所以这两个场景下功能正常。

可行解决方法

方案1:每次下载动态生成临时<a>标签(最稳妥,完全规避复用标签的缓存问题)

不要复用页面中固定的jsonLink标签,每次触发下载时生成临时标签,完成后立即销毁,代码示例:

// string为你提前生成的JSON字符串
const tempLink = document.createElement('a');
tempLink.download = 'exportedToJson.json';
tempLink.href = 'data:application/json;charset=utf-8,' + encodeURIComponent(string);
document.body.appendChild(tempLink);
tempLink.click();
document.body.removeChild(tempLink);

方案2:改用Blob对象生成URL适配Eel拦截逻辑

如果需要兼容更大体积的JSON导出,也可以用Blob替代data URI,Eel对Blob URL的拦截适配更完善,同时记得用完释放内存:

const jsonBlob = new Blob([string], { type: 'application/json' });
const blobUrl = URL.createObjectURL(jsonBlob);
const jsonLink = document.getElementById('jsonLink');
jsonLink.download = 'exportedToJson.json';
jsonLink.href = blobUrl;
jsonLink.click();
// 延迟释放避免下载请求还没发就被回收
setTimeout(() => URL.revokeObjectURL(blobUrl), 100);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 12:57:03