uniapp开发,安卓机的字节小程序downloadFile,返回的临时文件格式为.bin
目录
uniapp开发,安卓机的字节小程序downloadFile,返回的临时文件格式为.bin
小程序要做一个海报保存到相册的动作。后端返回的一个图片的二进制流文件的url( )。别看是链接是.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)
}
})
}
});
}
})
还是有些东西要补充的,比如文件的类型判断,临时文件用完后的删除工作等,就不不充了,这里给大家一个思路,完结。