31

POSTリクエストを介して写真をアップロードしようとしていますrequest module

readmeによると、私はこれを行うことができるはずです

var r = request.post("http://posttestserver.com/post.php", requestCallback)
var form = r.form()
form.append("folder_id", "0");
form.append("filename", fs.createReadStream(path.join(__dirname, "image.png")));

function requestCallback(err, res, body) {
    console.log(body);
}

問題は、これが機能しないことです。テスト サーバーから、0 個の投稿変数をダンプしたという応答がありました。

この小さな html ページでサーバーが正常に動作していることを確認しました。

<html>
    <body>
        <form action="http://posttestserver.com/post.php?dir=example" method="post" enctype="multipart/form-data">
            File: <input type="file" name="submitted">
            <input type="hidden" name="someParam" value="someValue"/>
            <input type="submit" value="send">
        </form>
    </body>
</html>

質問は、リクエストモジュールで何が間違っているのですか? multipart/form-dataノードで送信するより良い方法はありますか?

4

5 に答える 5

27

さらに調査した結果、 を使用することにしましたrestler module。これにより、マルチパート アップロードが非常に簡単になります。

fs.stat("image.jpg", function(err, stats) {
    restler.post("http://posttestserver.com/post.php", {
        multipart: true,
        data: {
            "folder_id": "0",
            "filename": restler.file("image.jpg", null, stats.size, null, "image/jpg")
        }
    }).on("complete", function(data) {
        console.log(data);
    });
});
于 2012-12-11T13:11:29.767 に答える
18

それで、私はこれと格闘して終わりました。これが私が学んだことです:

request も form-data も、生成されたボディ ストリームの content-length ヘッダーを設定していないことがわかります。

報告された問題は次のとおりです: https://github.com/mikeal/request/issues/316

@lildemonによって投稿されたソリューションは、次の方法でこれを回避します。

  1. FormData オブジェクトの生成
  2. 長さを取得する
  3. リクエストを作成し、フォーム オブジェクトと content-length ヘッダーを明示的に設定する

これはあなたの例の修正版です:

var request = require('request');
var FormData = require('form-data');

var form = new FormData();
form.append("folder_id", "0");
form.append("filename", fs.createReadStream(path.join(__dirname, "image.png")));

form.getLength(function(err, length){
  if (err) {
    return requestCallback(err);
  }

  var r = request.post("http://posttestserver.com/post.php", requestCallback);
  r._form = form;     
  r.setHeader('content-length', length);

});

function requestCallback(err, res, body) {
  console.log(body);
}
于 2013-12-10T22:47:41.647 に答える
5

1 つの例外を除いて、あなたの質問の状態を正確に実行する作業コードがあります。ファイルの内容は次のように追加されます。

form.append('file', new Buffer(...),
    {contentType: 'image/jpeg', filename: 'x.jpg'});

オプションの最後の引数を見つけるには、 のソースをドリルダウンする必要がありましたform-data。しかし、これで機能する構成が得られます。(おそらくそれはあなたが見逃していたものでしたが、もちろんそれはサーバーによって異なります。)

于 2013-08-14T06:18:42.730 に答える
3

request モジュールと form-data モジュールも試しましたが、ファイルをアップロードできませんでした。動作するスーパーエージェントを使用できます:

http://visionmedia.github.io/superagent/#multipart-requests .

var request = require('superagent');
var agent1 = request.agent();
agent1.post('url/fileUpload')
      .attach('file',__dirname + "/test.png")
      .end(function(err, res) {
          if (err) {
              console.log(err)
           }
       });
于 2015-09-26T09:38:10.750 に答える