2017-01-23 30 views
0

我有一個帶有寫入文件功能的Angular服務。該功能可以在Ionic或Electron平臺上工作。對於Ionic,它使用$ cordovaFile進行文件操作,對於Electron它使用節點fs庫。js.writeFile不能正確書寫Blob

的功能如下:

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); 
    } 
}; 

當使用離子平臺,功能工作正常,下載的文件是否正確寫入了。但是,使用Electron平臺時,所有下載的文件都是字符串[object Blob]

使用fs將Blob寫入文件的正確方法是什麼?

更多信息

數據最初歸結爲base64在JSON消息,但隨後我們這樣做有它

let fileBlob = this.stringUtilityService.b64ToBlob(dataObj.Data[i].FileContents, 'image/png'); 

    this.fileSystemService.writeFile(dataObj.Data[i].FileName, 'icons', fileBlob); 

EXTRA更多信息

這裏是b64ToBlob ()函數,儘管據我可以告訴這個函數工作正常,並正確地返回一個blob,Ionic應用程序正確保存並可以顯示。

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

'data'參數代碼中有什麼樣的數據?它是base64編碼數據嗎? – IzumiSy

+0

增加了原始文章的更多信息。 –

+0

明白了。我想這個帖子會幫助你知道如何將base64轉換爲blob:http://stackoverflow.com/questions/23986953/blob-saved-as-object-object-nodejs – IzumiSy

回答

1

重寫b64ToBlob功能,像下面的代碼將工作正常。 如果base64編碼的字符串具有它,則需要取出標題字符串data:image/gif;base64,

b64ToBlob(b64Data: string): any { 
    return Uint8Array.from(atob(b64Data), (c) => c.charCodeAt(0)); 
}