收藏
回答

wx.downloadFile 下载文件返回 tempFilePath 无文件后缀?

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.downloadFile 微信iOS客户端 7.0.14 2.12.0

前段时间还仅仅是个例,比较少遇到这种问题,大部分场景下都是正常,但最近是好多机型反馈都出现无法保存文件至相册的问题,原因就是 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 后 仍然无法识别出文件后缀?

最后一次编辑于  2020-07-11
回答关注问题邀请回答
收藏

2 个回答

  • Stephen
    Stephen
    2020-07-11

    找到原因了,这里自问自答一下吧,content-type 设置的 "video/mp4;charset=utf-8" 与 “video/mp4” 属于两个不同类型,平台没有自动过滤掉编码的设置,其他媒体类型同理。猜测可能是直接取值然后 === 判断支持的类型。而没有考虑设置编码的情况需要截取判断。

    这里也记录一下吧,如果后端使用的是 Java 中 spring-boot 生成的标头,HttpEncodingAutoConfiguration 设置了 spring.http.encoding.force=true,如果在 application.properties 中将此参数设置为 false,则省略 charset。

    2020-07-11
    有用
    回复
  • 灵芝
    灵芝
    2020-07-11

    你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html

    2020-07-11
    有用
    回复 1
    • Stephen
      Stephen
      2020-07-11
      问题原因找到了,官方可否做下兼容,处理掉 charset 值的情况呢?
      2020-07-11
      回复
登录 后发表内容
问题标签