Android平台FileReader与Cordova文件读取均失效问题求助
Android Cordova 文件读取卡住无报错问题排查与解决方案
问题分析
核心问题是Android平台下使用Cordova读取文件时,代码执行到读取步骤停滞,无结果也无报错。两种方法(FileReader、Cordova readAsDataURL)表现一致,且确认文件存在、内存充足,说明大概率是未捕获异步错误或API使用不当导致的。
第一步:先捕获错误信息
因为你没有添加错误处理逻辑,无法定位具体问题。先给两种方法补上错误捕获:
1. 给FileReader添加错误监听
修改FileReader代码,补上错误回调:
const dirContent: Entry[] = await this.cordovaFile.listDir(this.file.dataDirectory, 'scans'); for (const entry of dirContent) { if (entry.isFile) { (entry as FileEntry).file(file => { const reader = new FileReader(); reader.onloadend = (data) => console.log('读取成功:', data.target?.result); // 添加FileReader错误监听 reader.onerror = (error) => console.error('FileReader错误:', error.target?.error); reader.readAsText(file); console.log('已触发读取'); }, (err) => console.error('获取File对象失败:', err)); // 补上file()方法的错误回调 } }
2. 给Cordova readAsDataURL添加try/catch
const dirContent: Entry[] = await this.cordovaFile.listDir(this.file.dataDirectory, 'scans'); for (const entry of dirContent) { if (entry.isFile) { const e = entry as FileEntry; const path = this.file.dataDirectory + 'scans'; const index = e.nativeURL.lastIndexOf('/'); const filename = e.nativeURL.substring(index + 1); console.log('准备读取文件:', filename); try { const contents = await this.file.readAsDataURL(path, filename); console.log('读取结果:', contents); } catch (err) { console.error('readAsDataURL错误:', err); } } }
运行后查看控制台错误信息,就能明确卡住的具体原因(比如编码问题、文件权限、API参数错误等)。
针对JSZip打包的替代方案
你的目标是用JSZip打包文件,推荐使用ArrayBuffer格式读取文件(JSZip原生支持,且避免文本编码问题),以下是完整实现代码:
async function packScansToZip() { const zip = new JSZip(); const dirContent: Entry[] = await this.cordovaFile.listDir(this.file.dataDirectory, 'scans'); for (const entry of dirContent) { if (entry.isFile) { const fileEntry = entry as FileEntry; try { // 用Promise封装FileReader异步操作 const arrayBuffer = await new Promise((resolve, reject) => { fileEntry.file(file => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = () => reject(reader.error); reader.readAsArrayBuffer(file); }, (err) => reject(err)); }); // 将文件添加到zip包 zip.file(fileEntry.name, arrayBuffer); console.log(`已添加文件: ${fileEntry.name}`); } catch (err) { console.error(`读取文件失败 ${fileEntry.name}:`, err); } } } // 生成zip文件(blob格式) const zipBlob = await zip.generateAsync({ type: 'blob' }); // 保存zip到本地目录 await this.cordovaFile.writeFile( this.file.dataDirectory, 'scans.zip', zipBlob, { replace: true } // 覆盖已存在的文件 ); console.log('Zip文件已生成并保存'); }
额外排查点
- 检查Cordova File插件版本:确保使用最新稳定版(
cordova-plugin-file@latest),旧版本可能存在Android 10+的兼容性问题。 - 确认文件类型:如果是二进制文件(图片、PDF等),用
readAsText可能导致读取异常,改用readAsArrayBuffer或readAsDataURL更合适。 - 异步循环处理:如果目录下有多个文件,确保异步操作正确等待,避免并发阻塞(上面的代码用
await逐个处理文件,已规避此问题)。
内容的提问来源于stack exchange,提问作者elnezah
相关产品推荐
相关产品推荐

