目标:我的应用程序创建一个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);
}
}