(科尔多瓦/电容器)从其应用程序下载文件?

Cod*_*uit 7 filesystems android download cordova capacitor

目标:我的应用程序创建一个 zip。用户将其下载到他们的设备上。

问题:它在 Electron 和浏览器上完美运行,但在 Android 上却不起作用

尝试 1 window.showSaveFilePicker()

      const fileHandle = await window.showSaveFilePicker({suggestedName: 'package.zip'});
      const writable = await fileHandle.createWritable();
      await writable.write(blob);
      await writable.close();
Run Code Online (Sandbox Code Playgroud)

打开一个窗口来保存文件。适用于浏览器Windows 应用程序。在Android上,没有任何反应。

尝试2 下载链接

      const downloadUrl = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href =  downloadUrl; 
      link.target= '_blank';
      link.download = 'package.zip';
      document.body.appendChild(link);
      link.click();
Run Code Online (Sandbox Code Playgroud)

打开一个窗口来保存文件。适用于浏览器Windows 应用程序。对于Android来说,没有。AndroidStudio 日志:E/Capacitor:无法打开资产 URL

尝试 3 下载链接与本地文件(只是为了检查)

<a href="/assets/imgs/pack.zip" download>DOWNLOAD</a>
Run Code Online (Sandbox Code Playgroud)

适用于浏览器Windows 应用程序。对于Android,没有什么,同样的错误。

尝试 4 个替代方案

const path = `${directory}/${name}`;
const blob = new Blob([file], {type: file.type});
const data = await this.blobToBase64(blob);
await Filesystem.writeFile({path, data, directory: Directory.Documents, encoding: Encoding.UTF8});
Run Code Online (Sandbox Code Playgroud)

使用文件系统(Directory.Documents)保存到用户的设备。我想避免,它对用户不友好并且不起作用,因为文件被转换为 base64 以供 Android 文件系统 API 使用。它们无法使用。:/

附加信息

AndroidManifest.xml

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
Run Code Online (Sandbox Code Playgroud)

包.json

"@capacitor/android": "^3.6.0",
"@capacitor/core": "^3.6.0",
"@capacitor/filesystem": "^1.1.0",
Run Code Online (Sandbox Code Playgroud)

小智 0

我设法让它与 FileSharer 插件一起使用。

在我的实现中,我通过 HTTP 请求检索文件,但 FileSharer 还支持共享来自 base64 源的文件。

它的作用是打开一个共享弹出窗口,允许用户将文件保存在文件系统上或与其他应用程序共享。

“@byteowls/capacitor-filesharer”:“^4.0.0”

这是我的实现:

openFile(params: { res: any; filename: string}) {
    const file = new Blob([params.res], {type: 'application/octet-stream'});
    if (!window.hasOwnProperty('cordova')) {
      // Web implementation
    } else {
      const reader = new FileReader();
      reader.onload = () => {
          const dataUrl: any = reader?.result;
          if (dataUrl) {
            const base64 = dataUrl.split(',')[1];
            FileSharer.share({
              filename: params.filename,
              base64Data:   base64,
              contentType: 'application/octet-stream',
            });
          }

      };
      reader.readAsDataURL(file);
    }
  }
Run Code Online (Sandbox Code Playgroud)