下面通过downloadOaFile接口获取到二进制流,即
注意!!!直接用downloadOaFile获取的二进制流文件在写入时会导致文件损坏,必须在对象的属性中加上
({responseType: 'arraybuffer',...})
如果不加,默认是
responseType: 'text'
这一点非常重要,踩了好久的坑,而且这两点的区别在network的response中还看不出来,因为两者的看上去都是二进制流
注:arraybuffer是js内置的类,用于操作二进制文件,和blob差不多,所以我感觉也可以将转成arraybuffer,之后再用写入
下面是转为的arraybuffer的方案,但是由于没试过,我也不知道能不能成功
const textEncoder = new TextEncoder();
const arrayBuffer = (data).buffer;
const arrayBuffer是一个arrayBuffer对象,用buffer方法得到的
注:arraybuffer也可以通过new出来,它就是一段连续的内存空间,但是很神奇居然可以用变量申请内存大小如下
const arrayBuffer = new ArrayBuffer(len)//len可以是变量
但是不能直接操作arraybuffer,必须再arraybuffer上建立视图,从而进行写入和释放内存操作
const dataView = new DataView(arraybuffer);
参考`ArrayBuffer`对象到底是什么 简单读懂 - 掘金
接着用getFileSystemManager将二进制流写成文件
const fs = (); //获取全局唯一的文件管理器
({...})//将二进制流写成文件
最后通过文件扩展名判断用或者这两个api打开图片还是文件
完整代码如下
let filePath = .USER_DATA_PATH + "/"+;
(1111111111,item)
downloadOaFile({
filePath:,
fileName:,
}).then(res=>{
const fs = (); //获取全局唯一的文件管理器
// ({
// path: .USER_DATA_PATH,
// success: function(res) {
// ("临时文件目录已存在",res);
// },
// fail: function(err) {
// ("临时文件目录不存在,现在创建目录",err);
// ({
// dirPath: .USER_DATA_PATH,
// recursive: true,
// success: function(res) {
// ("创建目录成功",res);
// },
// fail: function(err) {
// ("创建目录失败",err);
// }
// });
// }
// })
(filePath)
(typeof filePath)
({ // 写文件
filePath: filePath, // .USER_DATA_PATH 指定临时文件存入的路径,后面字符串自定义
data: ,
encoding: "binary", //二进制流文件必须是 binary
success (res){
let imgExtName = ['png','jpg']
("成功写入文件",res)
if (()>-1){
({
current:,
urls:[filePath],
success: function (res) {
("成功打开图片",res)
(filePath)
// setTimeout(()=>{()},500)
},
fail(res){
("失败打开图片",res);
}
})
}else{
({ // 新开页面打开文档
fileType:,
filePath: filePath, //拿上面存入的文件路径
success: function (res) {
("成功打开文件")
// setTimeout(()=>{()},500)
},
fail(res){
("失败打开文件",res)
}
})
}
},
fail(res){
("写文件失败",res)
}
})
})