(Cordova/电容器)从其应用程序下载文件



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

问题:它与Electron和Browser完美配合,但与Android不配合

尝试1个窗口。showSaveFilePicker((

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

打开一个窗口以保存文件。适用于浏览器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();

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

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

<a href="/assets/imgs/pack.zip" download>DOWNLOAD</a>

适用于浏览器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});

使用FileSystem(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"/>

package.json

"@capacitor/android": "^3.6.0",
"@capacitor/core": "^3.6.0",
"@capacitor/filesystem": "^1.1.0",

我设法使它与FileSharer插件一起工作。

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

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

"字节/电容器文件共享器":"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);
    }
  }

最新更新