uniapp 打开二进制流文件
·
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);
}
}
更多推荐



所有评论(0)