我最近将我的 Ionic 4 Angular 应用程序发布为 Web 应用程序和原生 Android 应用程序。
在本机 Android 应用程序中,一切正常,除了保存下载的文件。
为了下载和保存文件,我一直使用file-saver
如下 npm 包(这是一个共享服务,每次我必须下载东西时调用,从 PDF 到图像等......):
import { saveAs } from 'file-saver';
// ...
saveGenericFile(api: string, fileinfos: any, idFile: string): any {
let mediaType = 'application/pdf';
let fileName = '';
if (fileinfos != null) {
mediaType = fileinfos.contentType;
fileName = fileinfos.fileName;
}
const headers = this.base.commonHeader;
const url = this.baseUrl + api + '?id=' + idFile;
this.http.post(url, null, { headers, responseType: 'blob' }).subscribe(
(response) => {
// tslint:disable-next-line: prefer-const
let blob = new Blob([response], { type: mediaType });
saveAs(blob, fileName);
}, e => {
console.error(e);
this.toastsvc.generateToast('ERROR! An error occurred while saving this File, try later or contact support', 'danger');
}, () => {
/* do nothing */
}
);
}
正如我上面所说,这个代码片段工作正常,但只是当我必须从网络版本中保存一些东西时。
我能找到的唯一在线示例都是关于 Cordova 和/或以前/已弃用的版本。
关于电容器,我刚刚找到了这个文档,并从中找到了这个代码片段:
import { Plugins, FilesystemDirectory, FilesystemEncoding } from '@capacitor/core';
const { Filesystem } = Plugins;
fileWrite() {
try {
Filesystem.writeFile({
path: 'secrets/text.txt',
data: "This is a test",
directory: FilesystemDirectory.Documents,
encoding: FilesystemEncoding.UTF8
});
} catch(e) {
console.error('Unable to write file', e);
}
}
但问题是我上面的函数返回一个 blob,而这个函数只接受一个字符串作为数据。
那么,在作为 Web 应用程序运行和作为 Android 本机应用程序运行时,是否有任何 Capacitor-Native 等效功能可用于下载(和保存)Blob 文件?
更新
我也尝试了以下方法,但它不起作用:
saveGenericFile(api: string, fileinfos: any, gidFile: string): any {
let mediaType = 'application/pdf';
let fileName = '';
if (fileinfos != null) {
mediaType = fileinfos.contentType;
fileName = fileinfos.fileName;
}
const headers = this.base.commonHeader;
const url = this.baseUrl + api + '?id=' + gidFile;
this.http.post(url, null, { headers, responseType: 'blob' }).subscribe(
(response) => {
if (!this.useCordovaDl) {
// tslint:disable-next-line: prefer-const
let blob = new Blob([response], { type: mediaType });
saveAs(blob, fileName);
} else {
this.blobFileWrite(fileName, response);
}
}, e => {
console.error(e);
this.toastsvc.generateToast('ERROR! An error occurred while saving this File, try later or contact support', 'danger');
}, () => {
/* do nothing */
}
);
}
blobFileWrite(filename: string, blobfile: Blob) {
const reader = new FileReader();
// This fires after the blob has been read/loaded.
reader.addEventListener('loadend', (e: any) => {
const text = e.srcElement.result;
this.fileWrite(filename, text);
});
// Start reading the blob as text.
reader.readAsText(blobfile);
}
fileWrite(filename: string, filedata: string) {
try {
Filesystem.writeFile({
path: filename,
data: filedata
// ,
// directory: FilesystemDirectory.Documents,
// encoding: FilesystemEncoding.UTF8
});
} catch (e) {
console.error('Unable to write file', e);
}
}
更新#2
看起来GitHub 上仍有一个关于使用电容器保存 Blob 数据的未解决问题。同时,我将寻找 Cordova 解决方案。或者,如果平台是 android 或 ios,我将简单地禁用每个下载按钮。
如果我能找到一个,我将在这里发布所有有效的 Cordova 解决方法