uniapp开发,安卓机的字节小程序downloadFile,返回的临时文件格式为.bin

小程序要做一个海报保存到相册的动作。后端返回的一个图片的二进制流文件的url( https://www.xxx.cn/admin/file/dlback?fileName=ali-background/mybank/ss/playbill/show11.png)。别看是链接是.png,但它真的是二进制文件。

正常的逻辑: downloadFile下载远程图片资源到本地,通过本地路径saveImageToPhotosAlbum保存到相册。苹果手机和开发工具下载保存都是没有问题的,但是安卓手机(可能是部分安卓手机)保存失败。

部分安卓手机小程序调用downloadFile url,保存在本地的临时路径为ttfile://temp/xxxxx.bin,然后saveImageToPhotosAlbum保存图片,显示格式不支持。

.bin显示格式不支持也正常,但是为什么苹果手机和开发工具都没有问题呢,暂时未知。不过提示格式不正确嘛,那就转格式,就是二进制流文件转png/jpg/pdf等等。

怎么把二进制流的文件链接转为各种格式的文件呢?小程序都有文件管理器,文件管理器里有一个方法 FileSystemManager.writeFile。(应该都有,天下小程序本一家嘛)

FileSystemManager.writeFile: 写文件,传入写入内容或二进制码,指定写入字符编码,命名你要的格式,返回的就是你要的文件/图片。等于是代替downloadFile,毕竟他给的格式你用不了。上代码: 

// 通过url拿到二进制数据
uni.request({
	url: 'https://www.xxx.com/show.png',// 二进制文件远程资源链接
	responseType:'arraybuffer',
	success: res=> {
        // 创建文件管理器
		const mannger = uni.getFileSystemManager()
        // 命名地址 注意 我这里是字节小程序的地址 微信的地址可以把'ttfile://user/'换为 wx.env.USER_DATA_PATH
        // 因为是图片所以我直接写为.jpg    应该需要判断文件类型
		const filePath = 'ttfile://user/' + moment().unix() + '.jpg';
         //写入文件
		mannger.writeFile({
			filePath,  // 写入临时文件的地址
			data: res.data,  // 二进制码
			encoding: 'base64', // 写入格式,因为是图片 pdf的话写utf8
			success(_res) {
                // 图片保存
				uni.saveImageToPhotosAlbum({ // 保存图片到相册
					filePath: filePath, // 临时文件的地址
					success: function (res) {
						console.log('保存成功', res)
						uni.showToast({
							title: '保存成功',
						})
					},
					fail: function (err) {
						console.log('保存失败', err)
					}
				})
			
			}
		});
	}
})

还是有些东西要补充的,比如文件的类型判断,临时文件用完后的删除工作等,就不不充了,这里给大家一个思路,完结。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值