1. uniapp 打开二进制流文件

1.1. uniapp 打开二进制流word文件

  uni.openDocument:新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx 。
  注意图片预览不能用这个,其次,要预览文件必须先下载文件 uni.downloadFile 。
  官方API:uni-app官网
在这里插入图片描述

uni.downloadFile({
  url: 'https://example.com/somefile.pdf',
  success: function (res) {
    var filePath = res.tempFilePath;
    uni.openDocument({
      filePath: filePath,
      showMenu: true,
      success: function (res) {
        console.log('打开文档成功');
      }
    });
  }
});

1.2. uniapp安卓端 arraybuffer 转存成文件

/**
 * 把 ArrayBuffer 保存为文件(Android 10+ 零权限兼容)
 * @param {ArrayBuffer} arrayBuffer 二进制数据
 * @param {String} filename          文件名(如 report.pdf)
 */
export function downloadByBlob(arrayBuffer, filename) {
    // 1. 获取外部私有目录:/sdcard/Android/data/包名/files/Download
    const rootPath = '_downloads/'; // 5+ 沙盒路径,等价于外部私有 Download 目录
    const filePath = rootPath + filename;

    // 2. 创建文件并写入
    plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, function(fs) {
        fs.root.getFile(filename, { create: true }, function(fileEntry) {
            fileEntry.createWriter(function(writer) {
                writer.onwrite = function() {
                    console.log('文件已保存:' + filePath);
					plus.nativeUI.toast('文件已保存:' + filePath);
                    // 3. 打开文件(系统弹窗)
                    plus.runtime.openFile(filePath, {}, function(err) {
                        if (err) {
                            plus.nativeUI.toast('打开文件失败:' + err.message);
                        }
                    });
                };

                writer.onerror = function(e) {
                    console.error('写入失败', e);
                    plus.nativeUI.toast('保存失败');
                };
				console.log('开始写入',arrayBuffer) // 只支持string 操蛋,好像5+版本更新了app基座?
                // ✅ 写入 ArrayBuffer
				const base64 = uni.arrayBufferToBase64(arrayBuffer)
                writer.writeAsBinary(base64);
				
            });
        }, function(e) {
            console.error('文件创建失败', e);
            plus.nativeUI.toast('保存失败');
        });
    }, function(e) {
        console.error('文件系统访问失败', e);
        plus.nativeUI.toast('保存失败');
    });
}

export function arrayBuffer2PublicDownload(arrayBuffer, fileName) {
    try {
        const main = plus.android.runtimeMainActivity();
        const MediaStore = plus.android.importClass('android.provider.MediaStore');
        const ContentValues = plus.android.importClass('android.content.ContentValues');
        const Base64 = plus.android.importClass('android.util.Base64');
        const Intent = plus.android.importClass('android.content.Intent');

        /* 1. 占坑 MediaStore */
        const cv = new ContentValues();
        cv.put(MediaStore.Downloads.DISPLAY_NAME, fileName);
        cv.put(MediaStore.Downloads.MIME_TYPE, '*/*');
        cv.put(MediaStore.Downloads.RELATIVE_PATH, 'Download');
        const resolver = plus.android.invoke(main, 'getContentResolver');
        const uri = plus.android.invoke(resolver, 'insert',
                                       MediaStore.Downloads.EXTERNAL_CONTENT_URI, cv);
        if (!uri) throw new Error('MediaStore 拒绝');

        /* 2. 打开输出流 */
        const outs = plus.android.invoke(resolver, 'openOutputStream', uri);

        /* 3. ArrayBuffer → Base64 → Java byte[]  (在 Java 层解码)*/
        const base64 = uni.arrayBufferToBase64(arrayBuffer);
		console.log(base64.length,'base64.length')
        const javaBytes = Base64.decode(base64, Base64.NO_WRAP);
		console.log(javaBytes.length,'javaBytes.length')

        /* 4. 一次性写 & 关闭 */
        plus.android.invoke(outs, 'write', javaBytes);
        plus.android.invoke(outs, 'flush');
        plus.android.invoke(outs, 'close'); 

        /* 5. 通知系统刷新 */
        main.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
		
        plus.nativeUI.toast('已保存到下载目录');
    } catch (e) {
        plus.nativeUI.toast('保存失败:' + e);
    }
}

更多推荐