首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >离子6-电容文件系统-从ZIP复制SQLite文件

离子6-电容文件系统-从ZIP复制SQLite文件
EN

Stack Overflow用户
提问于 2022-07-05 09:36:23
回答 1查看 425关注 0票数 1

大家好,谢谢大家抽出时间来阅读和回答。

描述

我是使用Ionic 6角14电容器。我需要复制用户上传的ZIP文件的内容(它包含.sqlite文件),并将其存储在Documents文件夹中。为此,我使用JSZip库。

代码语言:javascript
运行
复制
  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文件夹中时,会出现问题。

代码语言:javascript
运行
复制
  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的终端抛出此错误:

代码语言:javascript
运行
复制
{"errorMessage":"Unable to save file"}

我尝试了文件插件(awasome-cordova- File ),但它不起作用。

代码语言:javascript
运行
复制
  public async write(
    path: string,
    data: ArrayBuffer,
    directory: Directory = Directory.Documents
  ): Promise<any> {
    return await File.writeFile(path, '', data, {replace: true})
  }

它引发下一个错误:

代码语言:javascript
运行
复制
[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}}}

测试解决方案

  1. I试图将ZIP文件读取为ArrayBuffer或Blob,但文件系统插件只能使用字符串数据,因此无法工作。
  2. I还试图将文件系统的编码值更改为UTF-8、UTF-16和ASCII,但没有工作。默认值是Base64编码。
  3. I尝试使用科尔多瓦文件插件。在以前的应用程序版本中,这是很好的工作,所以我尝试它(当应用程序使用科尔多瓦,而不是电容器)。没起作用。

理论

  1. --我不知道这里发生了什么,但似乎与编码有关。文件系统不是设计的4拷贝suppose.
  2. Maybe文件I .sqlite与相关路径相关的东西,但我不这么认为。

备注

  1. ,我只需要它在iOS和电子平台上工作。浏览器可能是一个优势,但不是必需的。
  2. 我知道API/REST方法可能会更好,但对于这个应用程序来说是不合适的。我们需要存储数据localy.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-15 12:46:59

好的。几天后,我终于找到了解决办法。给你,如果它能帮助任何人..。

我更改了从ZIP文件中读取的方式,将“string”替换为“blob”,在下面的片段中可以看到:

代码语言:javascript
运行
复制
  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助手函数,如下所示:

代码语言:javascript
运行
复制
  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 =读取它)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72867155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档