前段时间还仅仅是个例,比较少遇到这种问题,大部分场景下都是正常,但最近是好多机型反馈都出现无法保存文件至相册的问题,原因就是 wx.downloadFile 返回的 tempFilePath 没有文件后缀,导致无法保存至相册中。服务器也一直是正常有返回 header 声明的 content-type ,但仍就无法识别。
在社区里搜了很多关于这类下载的问题,没有很好的解决方案,官方也没明确说已修复完成。有说通过 wx.downloadFile() 传入指定 filePath 的,自行命名文件后续的。形似于这样的:
wx.downloadFile({
url: targetUrl,
filePath: wx.env.USER_DATA_PATH + '/xxx.mp4', // 加上文件类型后缀
success(res){
wx.saveVideoToPhotosAlbum({ filePath: res.filePath })
}
});
但查了一下官方相关文档声明(https://developers.weixin.qq.com/miniprogram/dev/framework/ability/file-system.html),发现本地用户文件是有限制的
小程序最多可存储空间为 10MB ,也就是说,如果不及时清除历史文件,下载的文件累加起来很容易就超了。无论保存有多少个文件,总和大小不能超过 10MB。否则就会报 “fail the maximum size of the file storage limit is exceeded” 存储空间不足的错误,实践后也确是如此。于是做了一步操作就是每新启一个下载时,都会把历史下载的文件全部删除,稍微缓解了问题。但又会有其他的限制,因为没有设置 filePath 的下载是不限制存储大小的,设置 filePath 后就意味着即使每次都重置存储空间,单次下载的文件大小仍不能超过 10MB,可实际业务场景是会有很多文件超过 10MB 的,只能不设置 filePath 使用默认的 tempFilePath 的方式下载。所以希望官方能处理下为啥给出了正确的 content-type 后 仍然无法识别出文件后缀?
你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)
找到原因了,这里自问自答一下吧,content-type 设置的 “video/mp4;charset=utf-8” 与 “video/mp4” 属于两个不同类型,平台没有自动过滤掉编码的设置,其他媒体类型同理。猜测可能是直接取值然后 === 判断支持的类型。而没有考虑设置编码的情况需要截取判断。
这里也记录一下吧,如果后端使用的是 Java 中 spring-boot 生成的标头,HttpEncodingAutoConfiguration 设置了 spring.http.encoding.force=true,如果在 application.properties 中将此参数设置为 false,则省略 charset。