2017-01-23 5 views
0

ファイルを書き込むための関数を持つAngularサービスがあります。この機能は、イオンまたは電子のいずれかのプラットフォームで機能することができます。 Ionicでは、ファイルアクションには$ cordovaFileを使用し、ノードfsライブラリにはElectronを使用します。js.writeBlobが正しく書かれていない

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

イオンのプラットフォームを使用する場合は、機能が正常に動作し、ダウンロードしたファイルが正しく離れて書かれているが、次のよう

関数です。ただし、電子プラットフォームを使用する場合、ダウンロードされるすべてのファイルには文字列[object Blob]が含まれています。

fsを使用してBlobをファイルに書き込む正しい方法は何ですか?

MORE INFOは

データは元々JSONメッセージにbase64でてダウンしていたが、我々はそれ

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

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

EXTRA MORE INFOここ

でこれを行うには、b64ToBlobです私の知る限り、この関数はうまく動作し、正しくIomeアプリが正しく保存して表示することができるBLOBを返します。

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

「データ」パラメータにはどのような種類のデータがありますか?それはbase64エンコードされたデータですか? – IzumiSy

+0

元の投稿に情報を追加しました。 –

+0

ポイントを得ました。私はこのポストは、あなたがblobにbase64を変換する方法を知っていると便利だと思う:http://stackoverflow.com/questions/23986953/blob-saved-as-object-object-nodejs – IzumiSy

答えて

1

次のコードのような機能を書き直すと正常に動作します。 base64でエンコードされた文字列には、data:image/gif;base64,のようなヘッダーシグネチャ文字列を取り出す必要があります。

b64ToBlob(b64Data: string): any { 
    return Uint8Array.from(atob(b64Data), (c) => c.charCodeAt(0)); 
} 
関連する問題