解决调用wx.downLoadFile下载的文件名乱码(长串英文字符)问题

这两天遇到一个需求,将统计数据生成的excel表在小程序中下载。

第一次在小程序中碰到下载的需求,一开始想像之前做公众号h5页面一样的方法直接用a标签下载附件,后来想起来小程序不支持a标签。

查了一下微信里面下载附件的,是用wx.downLoadFile来实现的。实际操作以后,发现下载下来的附件,文件名是一长串奇怪的英文,并不是像想象中一样可以自定义。这样如果用户保存之后想要找到这个文件,但是下载的文件太多了,名字又都是乱码,一方面不好找,另一方面看起来很乱。但是查看文档之后发现wx.downLoadFile中并没有用来记录文件名的参数,因此想到先运用wx.saveFile将临时文件保存下来,再修改文件名。

附文档地址:
微信小程序开发文档 - wx.downLoadFile
微信小程序开发文档 - wx.saveFile

这里运用FileSystemManager.rename,将文件名修改为自己想要的名字,即可解决问题。

注意,在使用之前要先获取全局唯一的文件管理器,即:
const FileSystemManager = wx.getFileSystemManager();
否则会报错FileSystemManager is not defined。

这里还有几个坑。

首先是,FileSystemManager.rename在使用时,报错fail permission denied。查了一下,需要在目标文件名前加上wx.env.USER_DATA_PATH,即:“newPath: wx.env.USER_DATA_PATH + ‘/1.png’”。其中,1.png是我的新文件名和后缀。

修改后,继续报错,原来是我路径写错了,我在文件名前面少了一个“/”符号,即:(上面的路径为了不误导,用的是正确的,请大家自行检查自己的路径是否有错误)

我的错误的路径‘newPath: wx.env.USER_DATA_PATH + ‘1.png’’

正确的路径‘newPath: wx.env.USER_DATA_PATH + ‘/1.png’’

一定要细心。

这样重命名后即可解决问题。

但我在回归测试的时候又遇到了一个问题,还是FileSystemManager.rename方法,报错rename: fail

既然是回归测试出了问题,说明第一次是可行的。

检查了半天代码,后来想到,我下载的是同一份文件,重命名时命名也是同一个名字,重名了,所以重命名失败。

这里errMsg里面是不会写清楚具体原因的,只有一个fail。所以要仔细查看自己的代码,看看问题具体出在了哪里。

找到问题就好办了。只要在重命名失败的方法里,将之前下载的文件删掉,重新再给新的文件命名就可以了。这里最好先用FileSystemManager.getFileInfo找一下这个重复的名字,找到了再调FileSystemManager.removeSavedFile进行删除,防止找不到或者删错了等情况发生。

因为这几个方法请求回调都很简单,全部都是小程序开发文档里的内容,就不另外贴项目代码了。没明白可以去小程序开发文档查询对应使用方法或询问我。

附文档地址:
微信小程序开发文档 - getFileSystemManager
微信小程序开发文档 - FileSystemManager

### 微信小程序 `wx.downloadFile` 安卓手机下载图片展示不全解决方案 在微信小程序开发过程中,如果遇到安卓设备上使用 `wx.downloadFile` 方法下载图片后展示不完整的情况,可能的原因涉及多个方面。以下是针对该问题的分析以及解决方案: #### 可能原因 1. **缓存机制问题** 安卓设备可能存在缓存处理不当的问题,导致部分数据未被完全加载或显示[^1]。 2. **文件路径错误** 使用 `wx.downloadFile` 后返回的临时文件路径可能存在问题,尤其是在不同机型上的兼容性差异较大。 3. **权限不足** 若用户的微信存储权限被关闭,则可能导致图片无法正常保存或读取,进而影响展示效果。 4. **图片格式支持** 部分安卓设备对某些特殊格式的图片支持较差,可能会造成渲染异常。 --- #### 解决方案 ##### 1. 检查并优化缓存逻辑 确保每次调用 `wx.downloadFile` 均获取最新的资源,可以通过设置请求头参数来强制刷新缓存: ```javascript wx.downloadFile({ url: 'https://example.com/image.jpg', // 图片地址 header: { 'Cache-Control': 'no-cache' // 强制不使用缓存 }, success(res) { const tempFilePath = res.tempFilePath; console.log('成功下载:', tempFilePath); } }); ``` ##### 2. 确认临时文件路径有效性 在使用 `tempFilePath` 渲染图片之前,建议先验证其合法性,并尝试重新加载失败的资源: ```javascript const imageSrc = '/path/to/temp/file'; // 替换为实际路径 try { wx.getImageInfo({ // 获取图片信息以确认路径有效 src: imageSrc, success(info) { console.log('图片信息:', info.width, info.height); // 继续操作... }, fail(err) { console.error('图片加载失败:', err); // 处理重试或其他替代方案 } }); } catch (e) { console.error('发生未知错误:', e); } ``` ##### 3. 提示用户开启必要权限 对于因权限不足引发的问题,可以在程序中检测当前状态并向用户提供指引: ```javascript if (!wx.canIUse('getSetting')) { // 判断是否支持 getSetting 接口 console.warn('当前环境暂不支持权限管理'); } else { wx.getSetting({ success(settingRes) { if (!settingRes.authSetting['scope.writePhotosAlbum']) { wx.authorize({ scope: 'scope.writePhotosAlbum', success() { console.log('已授权访问相册'); }, fail() { wx.showModal({ title: '提示', content: '请前往设置页面打开相关权限', confirmText: '去设置' }); } }); } else { console.log('已有写入相册权限'); } } }); } ``` ##### 4. 测试多种图片格式兼容性 为了规避特定格式带来的风险,可优先选用广泛支持的标准格式(如 JPEG 或 PNG),并通过服务端转换统一输出形式。 --- ### 总结 上述方法能够有效应对大部分由安卓设备特性引起的图片展示问题。然而需要注意的是,由于硬件与软件层面存在的多样性,仍需持续关注用户体验反馈并对代码进行迭代改进。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值