?下面通過downloadOaFile接口獲取到二進(jìn)制流,即res.data
注意?。?!直接用downloadOaFile獲取的二進(jìn)制流文件在寫入時(shí)會(huì)導(dǎo)致文件損壞,必須在uni.request對(duì)象的屬性中加上
uni.request({responseType: 'arraybuffer',...})
如果不加,默認(rèn)是
responseType: 'text'
這一點(diǎn)非常重要,踩了好久的坑,而且這兩點(diǎn)的區(qū)別在network的response中還看不出來,因?yàn)閮烧叩膔es.data看上去都是二進(jìn)制流
注:arraybuffer是js內(nèi)置的類,用于操作二進(jìn)制文件,和blob差不多,所以我感覺也可以將res.data轉(zhuǎn)成arraybuffer,之后再用fs.write寫入
下面是轉(zhuǎn)為的arraybuffer的方案,但是由于沒試過,我也不知道能不能成功
const textEncoder = new TextEncoder();
const arrayBuffer = textEncoder.encode(data).buffer;
const arrayBuffer是一個(gè)arrayBuffer對(duì)象,用buffer方法得到的
注:arraybuffer也可以通過new出來,它就是一段連續(xù)的內(nèi)存空間,但是很神奇居然可以用變量申請(qǐng)內(nèi)存大小如下
const arrayBuffer = new ArrayBuffer(len)//len可以是變量
但是不能直接操作arraybuffer,必須再arraybuffer上建立視圖,從而進(jìn)行寫入和釋放內(nèi)存操作
const dataView = new DataView(arraybuffer);
參考`ArrayBuffer`對(duì)象到底是什么 簡單讀懂 - 掘金
接著用getFileSystemManager將二進(jìn)制流寫成文件
const fs = uni.getFileSystemManager(); //獲取全局唯一的文件管理器
fs.writeFile({...})//將二進(jìn)制流寫成文件
?最后通過文件擴(kuò)展名判斷用uni.previewImage或者wx.openDocument這兩個(gè)api打開圖片還是文件文章來源:http://www.zghlxwxcb.cn/news/detail-564952.html
完整代碼如下文章來源地址http://www.zghlxwxcb.cn/news/detail-564952.html
let filePath = wx.env.USER_DATA_PATH + "/"+item.storageFileName;
console.log(1111111111,item)
downloadOaFile({
filePath:item.storageFileName,
fileName:item.storageFileName,
}).then(res=>{
const fs = uni.getFileSystemManager(); //獲取全局唯一的文件管理器
// fs.access({
// path: wx.env.USER_DATA_PATH,
// success: function(res) {
// console.log("臨時(shí)文件目錄已存在",res);
// },
// fail: function(err) {
// console.log("臨時(shí)文件目錄不存在,現(xiàn)在創(chuàng)建目錄",err);
// fs.mkdir({
// dirPath: wx.env.USER_DATA_PATH,
// recursive: true,
// success: function(res) {
// console.log("創(chuàng)建目錄成功",res);
// },
// fail: function(err) {
// console.log("創(chuàng)建目錄失敗",err);
// }
// });
// }
// })
console.log(filePath)
console.log(typeof filePath)
fs.writeFile({ // 寫文件
filePath: filePath, // wx.env.USER_DATA_PATH 指定臨時(shí)文件存入的路徑,后面字符串自定義
data: res.data,
encoding: "binary", //二進(jìn)制流文件必須是 binary
success (res){
let imgExtName = ['png','jpg']
console.log("成功寫入文件",res)
if (imgExtName.indexOf(item.extname)>-1){
uni.previewImage({
current:item.storageFileName,
urls:[filePath],
success: function (res) {
console.log("成功打開圖片",res)
console.log(filePath)
// setTimeout(()=>{wx.hideLoading()},500)
},
fail(res){
console.log("失敗打開圖片",res);
}
})
}else{
wx.openDocument({ // 新開頁面打開文檔
fileType:item.extname,
filePath: filePath, //拿上面存入的文件路徑
success: function (res) {
console.log("成功打開文件")
// setTimeout(()=>{wx.hideLoading()},500)
},
fail(res){
console.log("失敗打開文件",res)
}
})
}
},
fail(res){
console.log("寫文件失敗",res)
}
})
})
到了這里,關(guān)于微信小程序接收二進(jìn)制流文件(圖片預(yù)覽,文件打開)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!