私は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
引用:
Iは、POST要求をパイプにバッファを要求モジュールを使用することができるはず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))
_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
}
};
}
何このリターン 'url.parse( '$ {this.coreBaseUrl}/$ {resourceNameのを} ') '? –
例: this.coreBaseUrl = 'http://www.url.to/api' resourceName = '記事'または 'ユーザー'または 'コメント' 次に、url.parse(..)を使用して両方を有効なURLに追加します。 – Spetastium
'url.parse(..)の後に文字列として渡すかどうかを確認できますか? –