You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:10:36