我想使用multipart / form-data将一些属性和文件发送到Node JS应用程序。
客户端HTML表单:
<input id="picName" name="picName" class="form-control" placeholder="PicTitle..." style="border-radius: 1%; margin: 1%" type="name">
<form id="frmUploader" enctype="multipart/form-data" action="/post/picture/" method="post">
<input id="file" type="file" name="picUploader" multiple /><br>
<input class="btn btn-md btn-success" type="submit" name="submit" id="btnSubmit" value="Upload" /><br>
</form>
客户端JS:
$('#frmUploader').submit(function () {
var username = localStorage.getItem("userName");
var categoryName = $( "#categoryAddPic option:selected").text();
var picTitle = $('#picName').val();
var picture = $('input[name="picUploader"]').get(0).files[0];
var formData = new FormData();
formData.append('picture', picture);
formData.append('username', username);
formData.append('categoryName', categoryName);
formData.append('picTitle', picTitle);
$.ajax({
method: 'POST',
url: 'http://localhost:3000/post/picture',
data: formData,
headers:{
"Authorization": "bearer " + token
},success:function (respond) {
...
});
}
return false;
});
现在我想在我的Node应用程序中保存表单的数据。如果有必要也知道,我使用multer来保存服务器上的文件。
感谢您的帮助。
PS:节点版本为4.8.3
节点JS:
app.post('/post/picture',function (req, res, next) {
var picName = req.body.picName;
var username = req.body.username;
var displayPic = req.body.displayPic;
var createdAt = moment();
var updatedAt = moment();
var categoryName = req.body.categoryName;
var picIdForCat = null;
try {
if (username) {
upload(req, res, function (err) {
if (err) {
return res.end("Something went wrong!");
}
//return res.end("File uploaded sucessfully!.");
picName = pictureSaveFormat;
var pictureCont = "./pictures/" + picName + ".jpg";
User.findOne({
where: {username: username}
}).then(function (user) {
var picture = {
picName: picName,
picture: pictureCont,
displayPic: null,
createdAt: createdAt,
updatedAt: updatedAt,
UserIdUser: user.idUser
};
Pictures.create(picture);
if (categoryName) {
Pictures.findOne({
where: {picName: picture.picName}
}).then(function (pic) {
picIdForCat = pic.idPic;
Category.findOne({
where: {categoryName: categoryName}
}).then(function (category) {
var catId = category.idCat;
var catForPic = {PictureIdPic: picIdForCat, CategoryIdCat: catId};
CategorieForPic.create(catForPic);
//res.redirect('localhost:3000/index.Admin.html');
res.status(200).json({message: "Picture from: " + username + " with name: " + picName + " created with " + category.categoryName + "."});
})
}).catch(function (req, res, err) {
res.status(500).json({message: "Error: Adding Category to pic", reason: err});
});
} else {
//res.redirect('localhost:3000/index.Admin.html');
res.status(200).json({message: "Picture from: " + username + " with name: " + picName + " created without a category."});
}
}).catch(next);
});
} else {
res.status(404).json({message: "Not found.", reason: "A required parameter is missing."});
}
}catch (err){
res.status(500).json({message: "Fatal Server error: ", reason: err});
}
});
答案 0 :(得分:2)
使用带有jQuery.ajax的FormData对象时,必须将processData设置为false,以便jQuery不会尝试将FormData对象和contentType编码为false,以便jQuery不会设置任何内容类型标头。当FormData与ajax一起使用时,会为您生成正确的内容类型标题。
$.ajax({
method: 'POST',
url: 'http://localhost:3000/post/picture',
data: formData,
processData: false,
contentType: false,
headers:{
"Authorization": "bearer " + token
},
success:function (respond) {
...
});
}
答案 1 :(得分:0)
标题:{ "Content-Type": "multipart/form-data", “授权”:“承载”+令牌 }, 它在我这边工作