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

Chrome73+下JavaScript命名文件下载失败问题求助

解决Chrome中Blob下载失败(Failed - no file)的问题

我帮你定位到问题啦!你当前的代码直接把Blob对象传给了saveAs函数,但Chrome 73这类较新的浏览器版本无法直接将Blob作为a标签的href值,必须先把Blob转换成浏览器可识别的临时对象URL,这就是你遇到「Failed - no file」或者无下载反应的原因。

问题根源

Blob是内存中的二进制数据容器,本身不是可直接访问的URL地址。2019年后浏览器对资源加载的安全性要求提升,不再支持直接将Blob赋值给a标签的href,必须通过URL.createObjectURL()生成临时URL来中转。

修复后的完整代码

function saveAs(blob, filename) { 
  var link = document.createElement('a'); 
  // 将Blob转换为浏览器可识别的临时URL
  var objectUrl = URL.createObjectURL(blob);
  
  if (typeof link.download === 'string') { 
    document.body.appendChild(link); 
    link.download = filename; 
    link.href = objectUrl; 
    // 下载完成后释放临时URL,避免内存泄漏
    link.addEventListener('click', function() {
      setTimeout(() => {
        URL.revokeObjectURL(objectUrl);
      }, 100);
    });
    link.click(); 
    document.body.removeChild(link); 
    console.log("下载已触发");
  } else { 
    location.replace(objectUrl); 
    URL.revokeObjectURL(objectUrl);
  } 
} 

var name = 'myfile.xyz'; 
var data = {hello: "world"}; 
var blob = new Blob([JSON.stringify(data, null, 2)], {type : 'application/json;charset=utf-8'}); 
saveAs(blob, name);

关键修改点说明

  • URL.createObjectURL(blob):生成一个指向内存中Blob数据的临时URL,浏览器可以通过这个URL读取Blob内容
  • URL.revokeObjectURL(objectUrl):临时URL会占用浏览器内存,下载完成后主动释放可以避免内存泄漏,尤其是频繁下载的场景
  • 延迟释放:设置100ms延迟是为了确保浏览器有足够时间处理下载请求,立即释放可能导致下载中断

这个修改在Chrome 73(Mac OS X)环境下可以正常触发下载,生成包含{hello: "world"}内容的myfile.xyz文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:40:26