plus io写文件bug uni-app
plus io写文件bug uni-app
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 24h2 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
HBuilderX类型:正式
HBuilderX版本号:4.72
手机系统:Android
手机系统版本号:Android 12
手机厂商:模拟器
页面类型:vue
vue版本:vue3
打包方式:云端
项目创建方式:HBuilderX
示例代码:
function getFS() { //这是获取fs的
return new Promise<PlusIoDirectoryEntry>((resolve, reject) => {
plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, fs => {
if (fs.root) {
resolve(fs.root);
} else {
reject({ code: -1, message: "获取文件系统失败!没有root" });
}
}, reject);
});
}
// 下面是写文件的代码 let writeFile = (filePath: string, data: string, isReject?: boolean) => { return new Promise<string>((resolve, reject) => { const fail = isReject ? reject : () => { resolve(""); }; getFS().then(fs => { fs.getFile(filePath, { create: true }, (file) => { file.createWriter((writer) => { // console.log(“开始转换数据”); // if (data.startsWith(“data:”) && data.indexOf(“base64,”) > 0) { // // data = atob(data.substring(data.indexOf(“base64,”) + 7)); // } console.log(“写入数据”, filePath, data.length, data.substring(0, 100)); // writer.seek(0); // 覆盖 writer.writeAsBinary(data); // writer.write(data); writer.onwriteend = ® => { // console.log®; const res: any = r.target; if (res.error) { fail(res.error); } else { resolve(plus.io.convertAbsoluteFileSystem(res.fileName)); } }; }, fail); }, fail); }).catch(fail); }); };
操作步骤:
代码示例
预期结果:
正确写入文件内容
实际结果:
写入的虽然是二进制数据,但是数据内容错误
bug描述:
android中 在使用plus.io 写入文件数据 类似 (data:audio/mpeg;base64,UklGRqTMOgBXQVZFZm10IBAAAAABAAEAgLsAAAB3AQACABAAZGF0YYDMOgAAAAAAAAAAAAAAAAAAA)(此处的数据不完整)数据时.出现写入的文件内容与提供的内容不一致. 我通过一系列的手段.终于实现了在APP里进行音频合成; 由于plus.io.write不支持二进制写入.于是将文件转化成了 如上的文本格式;然后在writer.writeAsBinary(data)成功后.发现写入的文件根本无法播放. 刚开始以为是我的文件合成过程中出现了什么问题; 期间走了很多弯路,浪费几天时间; 最终 我将这段数据 data:audio/mpeg;base64,UklGR… 直接放到webview中 audio 标签里的src里面时.发现是可以播放的;说明我的数据没有问题; 然后打开写入的文件一看.发现文件里面的数据出问题了.跟我手动转化的数据完全不同
更多关于plus io写文件bug uni-app的实战教程也可以访问 https://www.itying.com/category-93-b0.html
仔细分析了一下写入的二进制文件.修改的地方是在文件头部添加了15个字节
0x75, 0xAB, 0x5A, 0x6A, 0xE7, 0x62, 0xA3, 0xF9, 0xA9, 0x7A, 0x06, 0xDA, 0xB1, 0xEE, 0xB8,
最终分析;正好 前面15个字节是 data:audio/mpeg;
踩坑:!!!
如果是我提供的那种入局,应该是丢弃前面23个字符 data:audio/mpeg;base64, 刚开始我以为是直接丢弃前面15;结果报错不是base64字符; 这一下子就让我想到了.直接丢弃前面23个字符; 写入一次成功;
官网没有任何详细的说明, writer.write 是以纯文本方式写入,传递参数必须是 string; 而 writer.writeAsBinary 则是以base64格式写入数据;传入参数必须是base64格式字符串;
更多关于plus io写文件bug uni-app的实战教程也可以访问 https://www.itying.com/category-93-b0.html
客服你出来解释一下;
明明前面刚才好的坑;啥玩意也没动;现在突然writer.writeAsBinary写入的不是二进制了.而变成文本了.你出来告诉我.咋处理?
你好,请问使用plus.io写入二进制文件解决了吗,我看只能写入字符串
解决了,使用base64码,只是偶尔会写入文本.大多数情况下正常
在uni-app中使用plus.io写入base64数据时,writeAsBinary方法确实存在兼容性问题。Android平台对base64字符串的二进制处理可能出现编码错误。
问题核心在于writeAsBinary方法无法正确解析包含data URL前缀(data:audio/mpeg;base64,)的base64字符串。该方法期望接收纯base64数据,而非完整的数据URL。
建议修改写入逻辑:
// 提取纯base64数据
const pureBase64 = data.substring(data.indexOf('base64,') + 7);
// 使用writeText方法写入
writer.writeText(pureBase64);
// 或者转换为ArrayBuffer
const binaryString = atob(pureBase64);
const bytes = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
writer.write(bytes.buffer);

