微信小程序接收二进制流文件(图片预览,文件打开)

时间:2025-03-28 14:09:10

 下面通过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)
            }
        })
      })