没有FileReader也没有Cordova文件读取工作

9lowa7mx  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(108)

我已经为这个问题纠结了好几天了:我无法在Android中读取文件的内容。我尝试了两种方法,结果都一样:它不会继续读取文件(执行在那里冻结),我不会得到结果,也不会得到错误。
我用JS 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('I never get here');
                    reader.readAsText(file);
                    console.log('I get here');
                });
            }
        }

还尝试了 cordova readAsURL

const dirContent: Entry[] = await this.file.listDir(this.file.dataDirectory, 'scans');
        for (const entry of dirContent) {
            if (entry.isFile) {
                const e = entry as FileEntry;
                const path = this.file.dataDirectory + 'scans'; // d.fileName.substring(0, index);
                const index = e.nativeURL.lastIndexOf('/');
                const filename = e.nativeURL.substring(index + 1);
                console.log('I  get here');
                const contents = await this.file.readAsDataURL(path, filename);
                console.log('I never get here');
            }
        }

上两者相同:执行停止,没有结果或错误。我假设文件被找到了,因为如果我在路径或文件名上犯了错误,我会得到错误。目录I中唯一的文件的文件在500KB以下,RAM应该不是问题。
顺便说一下,我的目标是使用JSZip将文件打包到zip文件中,因此也欢迎阅读内容的替代方法。

8mmmxcuj

8mmmxcuj1#

这是令人疲惫和复杂的,但我找到了解决办法在这里:https://github.com/ionic-team/capacitor/issues/1564#issuecomment-538200971。整个线程充满了建议的解决方案,我建议详细阅读,因为对我有效的解决方案可能对您没有用。
我最后做了一个新的函数如下:

private async getFileContents(fileEntry: FileEntry): Promise<string> {
    return new Promise<string>(resolve => {
        fileEntry.file(iFile => {
            const fileReader = new FileReader();
            const zoneOriginalInstance = (fileReader as any).__zone_symbol__originalInstance;
            const reader = zoneOriginalInstance || fileReader;
            reader.onloadend = (data) => resolve(data.target._result as string);
            reader.readAsDataURL(iFile);
        });
    });
}

关键字是__zone_symbol__originalInstance,将其与FileReader进行“或”运算后,onloadend最终会触发正确的结果。

相关问题