web-dev-qa-db-ja.com

Node JS How to POST image with request data to another server / api

POST画像を私のNode JSアプリから別のアプリにREST APIを使用しています。Mongoに画像を持っています。 Node JSによって読み込まれ、別のAPIにPOSTされることになっているDB(バイナリ配列データとして)。

私が直面する問題は、画像と一緒にリクエストデータをどのように送信するかです。画像と一緒にPOSTする必要のあるこの未加工データ(JSON形式)があります。

{"data":{"client":"abc","address": "123"},"meta":{"owner": "yourself","Host": "hostishere"}}

「リクエスト」モジュールを使用してこれを行う必要があります。効果がある場合は、「マルチ」を使用できます。しかし、上記のリクエストデータを画像ストリームと一緒に送信するにはどうすればよいですか。以下は私の現在のコードです。それを終えるのを手伝ってくれませんか?

        var options = {
            Host: 'hostname.com',
            port: 80,
            path: '/api/content',
            method: 'POST',
            headers:{
                'Content-Type' : 'multipart/form-data'
            }
        };

        var request =  http.request(options, function(response) {
            var str = '';
            var respTime ='';

            response.on('data', function (chunk) {
                str = str.concat(chunk);
            });
            response.on('end', () => {
                console.log('No more data in response.');
            });

            setTimeout(function() {
                res.send(JSON.stringify(
                  {
                      'imageURL': IMG_URL,
                      'imageId': IMG_ID,
                      'body': JSON.parse(str)
                  }
                ));
            }, 1000);
        });

        request.on('error', (e) => {
          console.error('**** problem with request: ', e);
        });

        request.write(image.IMG_STR); //image.IMG_STR is the binary array representation of the image.
        request.end();

更新:2017年6月6日

そのため、私はたまたまエンドポイントを提供するRESTチームに話しかけ、データが次の特定の形式で送信される必要があることを発見しました。以下は、成功したリクエストのスナップショットです。誰かがNode使用すべきコードを教えてくれますか?form-dataパッケージを試しましたが、同じエラーが発生しています Postman Snapshot

7
rajugaadu

「他のAPI」も制御できる場合は、画像をバイナリデータのbase64表現としてポストボディに含める(およびAPI側でデコードする)ことができます。

2017年6月6日の更新への回答:

スクリーンショットによると、APIにはmultipart/formdataが必要です。 「リクエスト」モジュールを使用したこのようなリクエストは https://github.com/request/request#multipartform-data-multipart-form-uploads に記載されています。

簡単な例(テストされていません):

var formData = {
  Data: {data: {client: "abc" ...},
  file: fs.createReadStream('testImage_2.jpg'),
};
request.post({url:'<YourUrl>', formData: formData}, function optionalCallback(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});
9
Fabian

JSONデータを使用してbodyをリクエストに追加すると、それを送信できるはずです。

 var options = {
        Host: 'hostname.com',
        port: 80,
        path: '/api/content',
        method: 'POST',
        headers:{
            'Content-Type' : 'multipart/form-data'
        },
        body: {
            "data": {"client":"abc","address": "123"},
            "meta":{"owner": "yourself","Host": "hostishere"}
        }
 };

私が理解していないのは、setTimeoutres.sendres変数がどこにも定義されていない場合。