Express 和 Node JS:从多部分表单访问响应参数 POST
Express & NodeJS : Accessing response parameters from Multipart form POST
我有一个简单的表单,允许用户上传文件类型图像,并通过单选输入选择将文件的 "category" 类型附加到响应正文。
文件处理本身在后端按预期处理 - 但是,当涉及到访问响应正文中的参数时,我收到 UNDEFINED 作为参数值。任何人都可以就我可能忽略的内容提供一些建议吗?
这是标记和后端脚本的示例:
<!DOCTYPE html>
<html>
<head>
<script src="js/blueimp-gallery.min.js" async></script>
<script src="js/bootstrap.min.js" async></script>
<script src="https://code.jquery.com/jquery-3.1.1.min.js" async></script>
<script src="js/script.js" async></script>
<link rel="stylesheet" href="css/blueimp-gallery.min.css">
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
<div id="main">
<div class="navbar-wrapper" style="border: 12px solid black;">
<ul>
<li><a href="#">Login</a></li>
<li><a href="#">Sign up</a></li>
</ul>
</div>
<div>
<form
id = "uploadForm"
enctype = "multipart/form-data"
action = "/api/photo"
method = "post">
<input type="file" name="userPhoto" />
<input type="submit" value="Upload Image" name="submit">
<label>travel</label>
<input type="radio" value="travel" name="cat">
<label>food</label>
<input type="radio" value="food" name="cat">
<label>community</label>
<input type="radio" value="community" name="cat">
</form>
</div>
</body>
</html>
app.post('/api/photo', function(req,res){
console.log("request to upload image recvied.. upload in progress.");
//console.log("res.catype() = TODO " + req.get("cat"));
// Returning undefined*
console.log("res.catype() = " + res.cat);
// handle file persistence to disk.
upload(req,res,function(err) {
if(err) {
return res.end("Error uploading file.");
}
res.end("File is uploaded");
});
});
您应该从 req.body.cat
访问您的 cat
值,请参考 http://expressjs.com/en/4x/api.html#req.body 了解更多详情
不确定您是否 post 整个服务器端代码,但我没有提及 body-parser 中间件。您应该使用它来处理任何传入的 "post"。你应该总是在你的路线之前声明它们。这样,您可以使用 req.body
.
访问数据
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/api/photo', function(req,res){
console.log("request to upload image recvied.. upload in progress.");
//console.log("res.catype() = TODO " + req.get("cat"));
// Returning undefined*
console.log("res.catype() = " + res.cat);
// handle file persistence to disk.
upload(req,res,function(err) {
if(err) {
return res.end("Error uploading file.");
}
res.end("File is uploaded");
});
});
对于多部分表单(带有图像等附加文件的表单),您需要在 NodeJS 服务器上使用 Multer(或其他一些多表单解析器)而不是主体解析器。 link 会给你一个如何设置的例子。假设您的客户端 HTML/JS 设置正确,您将能够将图像提取为文件并将请求提取为正文信息。
服务器端 NodeJS 看起来像这样:
app.post('/api/photo', upload.any(), function (req, res, next) {
var files = req.files;
if (files) {//Checks to see if any attached files
files.forEach(function (file) {
console.log('FILE');
console.log(JSON.stringify(file));//contents of file
console.log(JSON.stringify(file.filename));
});
}
console.log(req.body);
res.sendFile(__dirname + "/resources/JSONStructures/genericResponse.json");
});
如果您可以post您的客户端JavaScript,这将有助于确定导致问题的原因。具体来说,我看到很多 AJAX 正在设置简短的方法,这会导致多表单出现问题。
我有一个简单的表单,允许用户上传文件类型图像,并通过单选输入选择将文件的 "category" 类型附加到响应正文。
文件处理本身在后端按预期处理 - 但是,当涉及到访问响应正文中的参数时,我收到 UNDEFINED 作为参数值。任何人都可以就我可能忽略的内容提供一些建议吗?
这是标记和后端脚本的示例:
<!DOCTYPE html>
<html>
<head>
<script src="js/blueimp-gallery.min.js" async></script>
<script src="js/bootstrap.min.js" async></script>
<script src="https://code.jquery.com/jquery-3.1.1.min.js" async></script>
<script src="js/script.js" async></script>
<link rel="stylesheet" href="css/blueimp-gallery.min.css">
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
<div id="main">
<div class="navbar-wrapper" style="border: 12px solid black;">
<ul>
<li><a href="#">Login</a></li>
<li><a href="#">Sign up</a></li>
</ul>
</div>
<div>
<form
id = "uploadForm"
enctype = "multipart/form-data"
action = "/api/photo"
method = "post">
<input type="file" name="userPhoto" />
<input type="submit" value="Upload Image" name="submit">
<label>travel</label>
<input type="radio" value="travel" name="cat">
<label>food</label>
<input type="radio" value="food" name="cat">
<label>community</label>
<input type="radio" value="community" name="cat">
</form>
</div>
</body>
</html>
app.post('/api/photo', function(req,res){
console.log("request to upload image recvied.. upload in progress.");
//console.log("res.catype() = TODO " + req.get("cat"));
// Returning undefined*
console.log("res.catype() = " + res.cat);
// handle file persistence to disk.
upload(req,res,function(err) {
if(err) {
return res.end("Error uploading file.");
}
res.end("File is uploaded");
});
});
您应该从 req.body.cat
访问您的 cat
值,请参考 http://expressjs.com/en/4x/api.html#req.body 了解更多详情
不确定您是否 post 整个服务器端代码,但我没有提及 body-parser 中间件。您应该使用它来处理任何传入的 "post"。你应该总是在你的路线之前声明它们。这样,您可以使用 req.body
.
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/api/photo', function(req,res){
console.log("request to upload image recvied.. upload in progress.");
//console.log("res.catype() = TODO " + req.get("cat"));
// Returning undefined*
console.log("res.catype() = " + res.cat);
// handle file persistence to disk.
upload(req,res,function(err) {
if(err) {
return res.end("Error uploading file.");
}
res.end("File is uploaded");
});
});
对于多部分表单(带有图像等附加文件的表单),您需要在 NodeJS 服务器上使用 Multer(或其他一些多表单解析器)而不是主体解析器。 link 会给你一个如何设置的例子。假设您的客户端 HTML/JS 设置正确,您将能够将图像提取为文件并将请求提取为正文信息。
服务器端 NodeJS 看起来像这样:
app.post('/api/photo', upload.any(), function (req, res, next) {
var files = req.files;
if (files) {//Checks to see if any attached files
files.forEach(function (file) {
console.log('FILE');
console.log(JSON.stringify(file));//contents of file
console.log(JSON.stringify(file.filename));
});
}
console.log(req.body);
res.sendFile(__dirname + "/resources/JSONStructures/genericResponse.json");
});
如果您可以post您的客户端JavaScript,这将有助于确定导致问题的原因。具体来说,我看到很多 AJAX 正在设置简短的方法,这会导致多表单出现问题。