12

私はreact-native-fsを使用しており、PDF ファイルの base64 を Android エミュレータ ファイル システムに保存しようとしています。

サーバーからbase64でエンコードされたpdfを受け取ります。
次に、base64 文字列を次の行でデコードします。

var pdfBase64 = 'data:application/pdf;base64,'+base64Str;

saveFile() 関数

saveFile(filename, pdfBase64){

    // create a path you want to write to
    var path = RNFS.DocumentDirectoryPath + '/' + filename;

     // write the file
     RNFS.writeFile(path, base64Image, 'base64').then((success) => {
       console.log('FILE WRITTEN!');
     })
     .catch((err) => {
       console.log("SaveFile()", err.message);
     });
}

エラー
pdfBase64 を保存しようとすると、saveFile() 関数が次のエラーをキャッチします。

bad base-64

質問
私がどこで、または何を間違っているのか、誰か教えてもらえますか? ありがとう。

4

3 に答える 3

21

同じ問題を抱えている人には、ここに解決策があります。

解決

react-nativive-pdf-view は、pdf_base64 へのファイル パスを取得する必要があります。

まず、react-native-fetch-blobを使用してサーバーから pdf base64 を要求しました (RN fetch API はまだ BLOB をサポートしていないため)。

また、react-native-fetch-blob には、「react-native-fs」ライブラリよりもドキュメントが充実しており、理解しやすい FileSystem API もあることがわかりました。(その FileSystem API ドキュメントをチェックしてください)

base64 pdf を受け取り、ファイル パスに保存します。

var RNFetchBlob = require('react-native-fetch-blob').default;

const DocumentDir = RNFetchBlob.fs.dirs.DocumentDir;

getPdfFromServer: function(uri_attachment, filename_attachment) {
   return new Promise((RESOLVE, REJECT) => {

      // Fetch attachment
      RNFetchBlob.fetch('GET', config.apiRoot+'/app/'+uri_attachment)
      .then((res) => {

          let base64Str = res.data;
          let pdfLocation = DocumentDir + '/' + filename_attachment;

          RNFetchBlob.fs.writeFile(pdfLocation, pdf_base64Str, 'base64');
          RESOLVE(pdfLocation);
      })
   }).catch((error) => {
       // error handling
       console.log("Error", error)
   });
}

私が間違っていたのは、上記の例のように pdf_base64Str をファイルの場所に保存することではありませんでした。私は次のように保存していました:

var pdf_base64= 'data:application/pdf;base64,'+pdf_base64Str;

これは間違っていました。

PDF ビューにファイル パスを入力します。

<PDFView
    ref={(pdf)=>{this.pdfView = pdf;}}
    src={pdfLocation}
    style={styles.pdf}
/>
于 2016-08-06T13:37:02.053 に答える
0

base64文字列のアプリケーションタイプを削除すると、うまくいきます

var pdfBase64 = 'data:application/pdf;base64,'+base64Str;

var pdfBase64 = base64Str;
于 2021-05-19T13:48:52.743 に答える