只有翅膀
只有翅膀
  • 发布:2025-06-28 15:52
  • 更新:2025-06-28 17:23
  • 阅读:70

【报Bug】plus.io写文件bug

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 24h2

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 = (r) => {
// console.log(r);
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里面时.发现是可以播放的;说明我的数据没有问题;
然后打开写入的文件一看.发现文件里面的数据出问题了.跟我手动转化的数据完全不同

2025-06-28 15:52 负责人:无 分享
已邀请:
只有翅膀

只有翅膀 (作者) - 80后IT老男人

仔细分析了一下写入的二进制文件.修改的地方是在文件头部添加了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格式字符串;

只有翅膀

只有翅膀 (作者) - 80后IT老男人

客服你出来解释一下;

明明前面刚才好的坑;啥玩意也没动;现在突然writer.writeAsBinary写入的不是二进制了.而变成文本了.你出来告诉我.咋处理?

要回复问题请先登录注册