簡體   English   中英

Node.js POST請求多部分/表單數據

[英]Nodejs POST request multipart/form-data

我正在嘗試通過帶有request module的POST請求上傳照片

根據自述文件,我應該能夠做到這一點

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個post變量。

我已經確認該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

經過更多研究后,我決定使用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);
    });
});

因此,我自己為此做好了角力,這就是我學到的東西:

事實證明,請求或表單數據都沒有為生成的主體流設置內容長度標頭。

這是報告的問題: 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);
}

我有可以正常執行您的問題說明的工作代碼,只有一個例外。 我的文件內容以這種方式附加:

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

為了發現最終的選項參數,我不得不深入研究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)
           }
       });

嘗試請求模塊。 它的工作方式與其他任何普通的發布請求一樣

var jsonUpload = {  };
var formData = {
    'file': fs.createReadStream(fileName),
    'jsonUpload': JSON.stringify(jsonUpload)
};
var uploadOptions = {
    "url": "https://upload/url",
    "method": "POST",
    "headers": {
        "Authorization": "Bearer " + accessToken
    },
    "formData": formData
}
var req = request(uploadOptions, function(err, resp, body) {
    if (err) {
        console.log('Error ', err);
    } else {
        console.log('upload successful', body)
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM