大家好,谢谢大家抽出时间来阅读和回答。
描述
我是使用Ionic 6与角14和电容器。我需要复制用户上传的ZIP文件的内容(它包含.sqlite文件),并将其存储在Documents文件夹中。为此,我使用JSZip库。
public async unzipFolder(file: File): Promise<string[]> {
const zip: JSZip = await JSZip.loadAsync(file);
const promises: Promise<string>[] = [];
zip.forEach((relativePath: string, zipFile: JSZipObject) =>
promises.push(this.unzipFile(zipFile));
);
return await Promise.all(promises);
}
public async unzipFile(compressedFile: JSZipObject): Promise<string> {
return await compressedFile.async('string').then((data: string) => {
this.fileOpsService.write(compressedFile.name, data)
});
}这里一切都很好。当我试图使用文件系统插件(电容器)将其存储到Documents文件夹中时,会出现问题。
public async write(
path: string,
data: string,
directory: Directory = Directory.Documents
): Promise<WriteFileResult> {
return await Filesystem.writeFile({
path: path,
directory: directory,
data: data,
recursive: false,
});
}XCode的终端抛出此错误:
{"errorMessage":"Unable to save file"}我尝试了文件插件(awasome-cordova- File ),但它不起作用。
public async write(
path: string,
data: ArrayBuffer,
directory: Directory = Directory.Documents
): Promise<any> {
return await File.writeFile(path, '', data, {replace: true})
}它引发下一个错误:
[DocumentManager] Failed to associate thumbnails for picked URL file:///private/var/mobile/Containers/Shared/AppGroup/XXX/File%20Provider%20Storage/TEST_BATCH2.zip with the Inbox copy file:///private/var/mobile/Containers/Data/Application/XXX/tmp/io.ionic.starter.ivan-Inbox/TEST_BATCH2.zip: Error Domain=QLThumbnailErrorDomain Code=102 "(null)" UserInfo={NSUnderlyingError=0x282532cd0 {Error Domain=GSLibraryErrorDomain Code=3 "Generation not found" UserInfo={NSDescription=Generation not found}}}测试解决方案
理论
备注
,
发布于 2022-07-15 12:46:59
好的。几天后,我终于找到了解决办法。给你,如果它能帮助任何人..。
我更改了从ZIP文件中读取的方式,将“string”替换为“blob”,在下面的片段中可以看到:
public async unzipFile(compressedFile: JSZipObject): Promise<void> {
return await compressedFile.async('blob').then(async (data: Blob) => {
const filename: string = compressedFile.name
.replace('.sqlite', 'SQLite.db');
const base64 = await this.convertBlobToBase64(data);
this.fileOpsService.write(filename, base64);
});
}我创建了一个convertBlobToBase64助手函数,如下所示:
private convertBlobToBase64 = (blob: Blob) => new Promise((resolve, reject) => {
const reader: FileReader = new FileReader();
reader.onerror = reject;
reader.onload = () => {
resolve(reader.result);
}
reader.readAsDataURL(blob);
})而且起作用了!请注意,我替换了文件名,因为我需要它以该格式使用另一个plugin =读取它)
https://stackoverflow.com/questions/72867155
复制相似问题