1、问题出现情况
前后端代码正常,小体积的附件可以正常下载,但是大体积附件下载前端会报"net::ERR_FAILED",后端会报"Connection reset by peer"(报错信息基于前端框架是vue,后端框架是java)
2、临时解决方案
临时关闭浏览器的省内存模式

3、问题出现原因
前端代码里使用用 axios({ responseType: "blob" }) 发请求,响应体不是边下边写文件,而是整段累积在页面的渲染进程内存里; 收完之后才 new Blob(res.data) + URL.createObjectURL 触发保存,然后Chrome 的「内存节省程序」做的事就是在内存压力下冻结 / 丢弃不活跃标签、回收渲染进程内存。它不是只按"闲置几分钟"触发,而是响应式的:系统一报内存压力就会动手,所以浏览器会把请求给终止
4、解决方案
(1)原生下载:浏览器直接落盘,不由页面持有内容,省内存模式、标签回收都不影响。代价是 <a href> 带不了请求头,token放不进去,做不了校验
(2)流式下载:用 StreamSaver / File System Access API 边下边写盘,但都需要 HTTPS 或较新内核,如果网站不是用HTTPS或者用户浏览器是IE等旧浏览器内核,可能不兼容
(3)兜底提示:下载前根据文件大小判断,超过阈值(比如 50 MB)提示"如遇下载失败,请关闭浏览器的内存节省/睡眠标签页",成本最低但治标