2016-10-03 3 views
2

私はbase64のエンコードされた画像から作成されたバッファを持っています。イムは、パイプ(リクエスト(..))fs.createReadStream(..)でサービスにPOSTで送信しようとしたが、次のエラーを取得:。)要求するパイプラインをストリームするとき、 'パスはnullバイトのない文字列でなければなりません'

Error: Path must be a string without null bytes 
    at nullCheck (fs.js:135:14) 
    at Object.fs.open (fs.js:626:8) 
    at ReadStream.open (fs.js:1916:6) 
    at new ReadStream (fs.js:1903:10) 
    at Object.fs.createReadStream (fs.js:1850:10) 
    at Promise (/Users/Sebbe/Documents/Code/leo-faq-service/lib/server/services/zendesk-service.js:120:10) 
[...] 

fs.createReadStreamを(文字列またはAのいずれかを取りますバッファ。文字列の場合、ファイルへのパスであることが期待されます。 fs.createReadStream()は、バッファであっても引数をパスを含む文字列として解決しようとしています。おそらく、Nodes Buffer APIのバグでしょうか?

詳細:

私はRestifyで構築されたノードのサービスを提供しています。このサービスには、件名、メッセージ、名前、base64でエンコードされた画像ファイル(jpg、pngなど)を取得するエンドポイントがあります。

これで、ノードのJavaScriptを使用して、ファイルのコンテンツをサードパーティのサービスに送信します。

これを読んだところ、バッファオブジェクトで「読み取り可能なストリーム」を作成し、それをサードパーティのサービスに送信する要求にパイプする必要があるといういくつかの情報源があります。

このため、私はBase64でエンコードされたイメージからバッファを作成し、それをfs.createReadStreamの引数として送信します。これをリクエストオブジェクトにパイプします。

これによると、私はbase64文字列からバッファを作成することができるはずです:https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_string_encoding

これによると、私はバッファから読み込み可能なストリームを作成することができるはずです。https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

そして、これに応じて要求モジュールのドキュメントからhttps://www.npmjs.com/package/request

引用:

You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case application/json) and use the proper content-type in the PUT request (if the headers don’t already provide one).

fs.createReadStream('file.json').pipe(request.put(url))

Iは、POST要求をパイプにバッファを要求モジュールを使用することができるはず

_postFile(base64FileContent) { 
 
    const fileBuffer = Buffer.from(base64FileContent, 'base64'); 
 
    const fileUploadOptions = this._getRequestPostFileOptions('uploads', fileBuffer.length); 
 

 
    return new Promise((resolve, reject) => { 
 
     fs.createReadStream(fileBuffer) 
 
     .pipe(request.post(fileUploadOptions) 
 
      .on('response', (response) => { 
 
      resolve(response); 
 
      }) 
 
      .on('error', (error) => { 
 
      reject(error); 
 
      }) 
 
     ); 
 
    }); 
 
    } 
 

 
    _getRequestPostFileOptions(resourceName, dataLength) { 
 

 
    return { 
 
     uri  : url.parse(`${this.coreBaseUrl}/${resourceName}`), 
 
     timeout : RequestTimeout, 
 
     method : 'POST', 
 
     headers : { 
 
     'Authorization' : `Basic ${this.auth}`, 
 
     'Content-Type' : 'application/binary', 
 
     'Content-Length' : dataLength 
 
     } 
 
    }; 
 
    }

+0

何このリターン 'url.parse( '$ {this.coreBaseUrl}/$ {resourceNameのを} ') '? –

+0

例: this.coreBaseUrl = 'http://www.url.to/api' resourceName = '記事'または 'ユーザー'または 'コメント' 次に、url.parse(..)を使用して両方を有効なURLに追加します。 – Spetastium

+0

'url.parse(..)の後に文字列として渡すかどうかを確認できますか? –

答えて

0

fs.createReadStream()常にその最初の引数としてファイルパスを取ります。 fs.createReadStream()のファイルパス引数として実際にバイナリファイルの内容を渡しているようです。私の仮定が正しければ、あなたはちょうどこのようrequest()に体としてのバッファを渡す必要がある必要があります。

return new Promise((resolve, reject) => { 
    fileUploadOptions.body = fileBuffer; 
    request.post(fileUploadOptions) 
     .on('response', (response) => { 
      resolve(response); 
      }) 
     .on('error', (error) => { 
      reject(error); 
     }); 
}); 
+0

ありがとう、私はそれをテストし、結果を返す。 – Spetastium

+0

[documentation](https://nodejs.org/api/fs。)によると、html#fs_fs_createreadstream_path_options)、最初の引数としてバッファを取ることができます。 – Grant

+0

@Grantはい、最近のバージョンのノードでは 'fs'のファイルパスにBufferオブジェクトを使用できますが、nullバイトそのため、ファイルパス入力が特に疑わしいのはこのためです。 – mscdex

関連する問題