MULTER: Как разрешить пользователю загружать фото и добавлять дополнительную информацию (например, имя) для отправки запроса

У меня работает базовое приложение Multer:

https://github.com/EngineeredTruth/multer

Вот HTML

<html>

<head>
    <title>File upload Node.</title>
</head>

<body>
    <form id="uploadForm" enctype="multipart/form-data" action="/api/photo" method="post">
        <input type="file" name="userPhoto" multiple />
        <input type="submit" value="Upload Image" name="submit">
        <select name="carlist" form="carform">
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="opel">Opel</option>
          <option value="audi">Audi</option>
        </select>
        <input type="text" value="title" name="title">
        </br><span id="status"></span>
    </form>
</body>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery.form/3.51/jquery.form.min.js"></script>
<script>
    $(document).ready(function() {
        $('#uploadForm').submit(function() {
            $("#status").empty().text("File is uploading...");
            $(this).ajaxSubmit({
                error: function(xhr) {
                    status('Error: ' + xhr.status);
                },
                success: function(response) {
                    console.log(response)
                    $("#status").empty().text(response);
                }
            });
            return false;
        });
    });
</script>

</html>

Вот сервер Node / Express

var express =   require("express");
var bodyParser =    require("body-parser");
var multer  =   require('multer');
var app =   express();
app.use(bodyParser.json());

var storage = multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads');
  },
  filename: function (req, file, callback) {
    if( file.mimetype === 'image/jpeg'){
      var name = Date.now() + "." + 'jpg'
    } else if (file.mimetype === 'image/png'){
      var name = Date.now() + "." + 'png'
    }
    callback(null, name);
  }
});

var limits = {
  fileSize: 10000000
}

var upload = multer({ storage : storage, limits : limits }).array('userPhoto',10)
// console.log(upload());

app.get('/',function(req,res){
      res.sendFile(__dirname + "/index.html");
});

app.post('/api/photo', function(req,res){
  // console.log('post request: ',req);
    upload(req,res,function(err) {
      console.log('after upload');
        //console.log(req.body);
        //console.log(req.files);
        if(err) {
            return res.end("Error uploading file: ", err);
        }
        res.end("File is uploaded");
    });
});

app.listen(3000,function(){
    console.log("Working on port 3000");
});

Все работает и пользователь может загрузить картинку. Однако я хочу, чтобы пользователь мог дать название фотографии, а также выбрать тип автомобиля на картинке, выбрав одну из машин в раскрывающемся меню.

Кажется, я не могу найти способ получить доступ к 'carlist' и 'title' с моего сервера узла, на котором получен почтовый запрос. Когда я использую console.log «req», я нигде не вижу список автомобилей или заголовок. Есть ли способ получить эту информацию на свой сервер узла из действия отправки формы?


person Matt Tran    schedule 27.12.2016    source источник


Ответы (1)


Взято из: https://github.com/expressjs/multer/issues/381.

если ваш элемент ввода файла находится в верхней части формы, тогда все данные ниже, которые назначаются req.body после загрузки вашего изображения, в результате чего тело остается пустым, пока вы загружаете фотографию .. Так что переместите элемент ввода файла в самый низ вашей формы, чтобы req.body имел данные из других элементов ввода

Так что в основном введите файл в нижней части формы. Также req.body не отображается в разделе '/ api / photo', но внезапно появляется в промежуточном программном обеспечении 'destination и' filename ', которое находится внутри функции загрузки.

person Matt Tran    schedule 27.12.2016