如何从未定义的表单中获取req.body

How can I get a req.body from a form that is not undefined?

本文关键字:获取 req body 表单 未定义      更新时间:2023-09-26

每当我提交一个包含信息的表单时,它都会以未定义的形式返回。我已经在下面发布了代码。如果我在表单中包含(enctype="multipart/form-data"),我不会收到任何正文(req.body)。但是,如果我不包含它,我会收到一个正文,但文件处理不起作用,页面只是继续加载。

app.post('/processupload', function(req, res) {
var date = new Date();
titles.push(req.body.pTitle);
descriptions.push(req.body.postDescription);
dates.push(date.toString());
file_names.push(req.body.fUpload);
console.log(req);
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files)
{
    if(err) return res.redirect(303, '/error');
}); 
form.on('end', function(fields, files)
{
    var temp_path = this.openedFiles[0].path;
    var file_name = this.openedFiles[0].name;
    var new_location = __dirname + '/public/images/';
    fs.copy(temp_path, new_location + file_name);
    res.redirect(303, 'home');
});

});

<form action="/processupload" enctype="multipart/form-data" method="POST" id="uploadForm" name="postForm">
    <p align="center" id="pUploadForm" name="pPostForm"><label for="photoTitle">Photo Title: </label>
    <input type="text" id="photoTitle" name="pTitle"><br>
    <br><input type="file" id="fileUpload" name="fUpload"><br>
    <br><label for="photoCaption">Photo Caption: </label><br>
    <textarea rows="10" cols="50" id="photoCaption" name="postDescription"></textarea><br><br>
    </p>
</form> 

几周前我创建了一个上传照片的项目。我使用了Angular和Node。但在没有Angular的情况下,它应该仍然可以工作,只使用Node。我使用了multer npm包。

var AWS = require('aws-sdk'); 
var s3 = new AWS.S3(); 
var multer = require('multer');
var upload = multer({ storage: multer.memoryStorage() }); //Save photo in memory
router.post('/processupload', upload.single('photo'), function(req, res, next){
  var bucketName = process.env.BUCKET_NAME;
  var file = req.file;
  var filename = file.originalname;
  var ext = _.last(filename.split('.'))
  var keyName = uuid.v4() + '.' + ext;
  var url = process.env.AWS_URL + bucketName + '/' + keyName;
  var params = { Bucket: bucketName, Key: keyName, Body: file.buffer, ACL: 'public-read' };
  s3.putObject(params, function(err, data) {
    if (err){
      return res.status(400).send(err)
    } else{
        console.log("Successfully uploaded data to myBucket/myKey");
        console.log("The URL is", url);
        res.send(url)
    }    
  });
});

这帮助我上传了图片,然后给了我S3 Bucket中的图片url。但是你可以随心所欲地处理这个文件。Multer允许您访问req.file,这样您就可以做任何需要做的事情,在这个例子中,我创建了一个唯一的id,以便获得一个发送回前端的url,从而以某种方式将其用作源。这是一个使用此代码的表单:

    <form action="/testupload" method='post' enctype='multipart/form-data'>
        <input type="file" name="photo" id="photo" multiple=false>
        <button type="submit">Submit</button>
    </form>

通过表单中的name="photo"调试需要很长时间的重要内容必须由upload.single('photo')中间件反映出来。我希望这能有所帮助,有很多方法可以解决这个问题,这只是其中之一。

来源:https://www.npmjs.com/package/multerhttp://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html