Nodejs POST запрос multipart/form-data
Я пытаюсь загрузить фотографию через запрос 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
с помощью node?
Ответы
Ответ 1
После еще нескольких исследований я решил использовать 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);
});
});
Ответ 2
Так что я просто справился с этим сам, и вот что я узнал:
Оказывается, ни запрос, ни данные формы не устанавливают заголовок длины содержимого для сгенерированного потока тела.
Ниже приведена проблема: https://github.com/mikeal/request/issues/316
Решение, отправленное @lildemon, обходит это:
- Создание объекта FormDatali >
- Получение длины
- Выполнение запроса и установка явно объекта формы и содержимого длины
Вот модифицированная версия вашего примера:
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);
}
Ответ 3
У меня есть рабочий код, который точно определяет ваш вопрос, за одним исключением. Содержимое моего файла добавляется следующим образом:
form.append('file', new Buffer(...),
{contentType: 'image/jpeg', filename: 'x.jpg'});
Чтобы узнать окончательный аргумент параметров, мне пришлось перейти в источник form-data
. Но это дает мне рабочую конфигурацию. (Возможно, это было то, чего вам не хватало, но, конечно, это будет зависеть от сервера.)
Ответ 4
Я также попробовал модули запроса и формы данных и не смог загрузить файл.
Вы можете использовать суперагент, который работает:
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)
}
});
Ответ 5
Попробуйте модуль запроса. Он работает, как и любой другой обычный почтовый запрос
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)
}
});