使用FileSaver.js移除JavaScript下载文件名中的时间戳
解决FileSaver下载CSV时文件名自动附加时间戳的问题
我之前也碰到过类似的情况,大概率是这两个原因导致的,咱们一步步来排查解决:
首先检查Blob的MIME类型是否正确
你当前设置的type: "multipart/form-data"完全不对呀!CSV文件的正确MIME类型应该是text/csv,这个错误可能导致FileSaver对文件的处理出现异常,进而自动附加时间戳。
修改后的代码应该是这样:
// 修正为正确的CSV MIME类型 let blob = new Blob([response], { type: "text/csv;charset=utf-8;" }); saveAs(blob, "xyz-29092918-28092019.csv");
其次检查服务器的响应头
如果上面的修改没用,那很可能是服务器返回的Content-Disposition头里已经指定了带时间戳的文件名。FileSaver在这种情况下会优先使用服务器指定的文件名,而不是你传入的参数。
举个例子,如果服务器返回的响应头是这样:
Content-Disposition: attachment; filename=xyz-29092918-28092019-2019-09-20T001653.611.csv
那前端的saveAs参数就会被忽略。这时候有两种解决办法:
- 修改服务器配置:让后端把
Content-Disposition里的文件名改成你想要的格式,不要附加时间戳 - 前端强制覆盖:如果没法改后端,就在前端处理响应时忽略响应头的文件名,直接用自己指定的。比如用fetch请求的话:
fetch('/你的API地址') .then(response => { // 直接获取blob内容,不读取响应头的文件名 return response.blob(); }) .then(blobData => { // 重新封装成正确的CSV Blob const csvBlob = new Blob([blobData], { type: "text/csv;charset=utf-8;" }); saveAs(csvBlob, "xyz-29092918-28092019.csv"); });
最后排查FileSaver版本问题
如果上面两步都试过还是不行,建议你更新到最新版本的FileSaver.js。某些旧版本的库存在自动附加时间戳的bug,更新后应该能解决。
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

