(Cordova/Capacitor)从其应用程序下载文件?

wdebmtf2  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(246)

**目标:**我的应用程序创建一个zip。用户将其下载到他们的设备上。
**问题:**它与Electron和浏览器完美兼容,但与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上,没有任何React。

尝试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应用程序。适用于Android,无。AndroidStudio日志:E/Capacitor:无法打开资产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});

使用文件系统(目录.文档)保存到用户的设备.我想避免,它不是用户友好的,不工作,因为文件被转换为base64由Android Filesktop 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",
gc0ot86w

gc0ot86w1#

我设法使它与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);
    }
  }

相关问题