我有一个Angular服务,它具有写文件的功能。该功能可以在Ionic或Electron平台上运行。对于Ionic,它使用$ cordovaFile进行文件操作,对于Electron,它使用节点fs库。
功能如下:
writeFile(filename: string, dirname: string, data: string | Blob, replace?: boolean): ngCordova.IFilePromise<ProgressEvent> {
if (this.isElectron) {
let promiseObj = this.$q.defer();
if (replace) {
try {
fs.unlinkSync('./' + dirname + '/' + filename);
}
catch (err) {
//err
}
}
fs.writeFile('./' + dirname + '/' + filename, data, 'binary', () => {
promiseObj.resolve(true);
});
return promiseObj.promise;
}
else {
return this.$cordovaFile.writeFile(cordova.file.dataDirectory + dirname, filename, data, replace);
}
};
使用Ionic平台时,该功能正常,下载的文件被正确写出。但是,使用Electron平台时,所有下载的文件都包含字符串[object Blob]
。
使用fs将Blob写入文件的正确方法是什么?
更多信息
数据最初在JSON消息中作为base64下载,但我们随后用它做
let fileBlob = this.stringUtilityService.b64ToBlob(dataObj.Data[i].FileContents, 'image/png');
this.fileSystemService.writeFile(dataObj.Data[i].FileName, 'icons', fileBlob);
额外信息
这是b64ToBlob()函数,虽然据我所知,这个函数工作正常并正确返回一个blob,Ionic app正确保存并可以显示。
b64ToBlob(b64Data: string, contentType: string): any {
let sliceSize = 512;
let byteCharacters = atob(b64Data);
let byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
let slice = byteCharacters.slice(offset, offset + sliceSize);
let byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
let byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
let blob = new Blob(byteArrays, { type: contentType });
return blob;
}
答案 0 :(得分:1)
将b64ToBlob
函数重写为类似下面代码的函数可以正常工作。
如果base64编码的字符串包含它,则需要取出data:image/gif;base64,
之类的标题签名字符串。
b64ToBlob(b64Data: string): any {
return Uint8Array.from(atob(b64Data), (c) => c.charCodeAt(0));
}