Как я могу получить req.body из формы, которая не определена?

Всякий раз, когда я отправляю форму с информацией, она возвращается как неопределенная. Я разместил код ниже. Если я включу (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> 

person unReaL    schedule 30.04.2016    source источник
comment
Вы должны получить доступ к телу формы через объект fields в обратном вызове form.parse. Вы не можете получить к нему доступ через req.body, так как это не объект запроса в стиле express.   -  person Soubhik Mondal    schedule 30.04.2016
comment
@BlazeSahlzen Большое спасибо!   -  person unReaL    schedule 30.04.2016


Ответы (1)


Несколько недель назад я создал проект с загрузкой фотографий. Я использовал 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)
    }    
  });
});

Это помогло мне загружать изображения, а затем возвращать мне URL-адрес изображения из корзины S3. Но вы можете обращаться с этим файлом, как хотите. Multer позволяет вам получить доступ к req.file, чтобы вы могли делать все, что вам нужно. В этом примере я создал уникальный идентификатор, чтобы получить 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/multer http://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html

person Sergio Prada    schedule 30.04.2016