Niether FileReader和Cordova File Read都无法正常工作



我已经为这个问题挣扎了几天:我无法在Android中读取文件的内容。我已经尝试了两种方法,在这两种方法中我都得到了相同的结果:它从未进一步读取文件(执行在那里冻结(,我没有得到结果,我没有错误。

我已经用JSFileReader尝试过了

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');
});
}
}

并在CordovareadAsURL上试用

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');
}
}

两者相同:执行停止,没有结果或错误。我假设文件是找到的,因为如果我在路径或文件名中犯了错误(根据建议(,我会出错。我目录中唯一的文件是500KB以下的文件,RAM应该不是问题。

顺便说一句,我的目标是使用JSZip将文件打包到一个zip文件中,因此也欢迎使用其他方法来读取内容。

这很累人,也很复杂,但我在这里找到了解决方案:https://github.com/ionic-team/capacitor/issues/1564#issuecomment-整个帖子都是建议的解决方案,我建议详细阅读,因为对我有用的解决方案可能对你没有用处。

我最后做了一个新功能如下:

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最终以正确的结果触发。

最新更新