Multer не может получить данные формы загрузки в Express 4

Я использую Ajax для загрузки данных формы. Вывод multer(req.file, req.body) всегда undefined/{};

Мой код сервера:

import multer from 'multer';
import post from './router/api_post';

var upload = multer({dest: 'uploads/'});

app.use('/api/post', upload.single('thumb') , post);

и файл маршрутизатора api_post:

import express from 'express';
var router = express.Router();

router
    .post('/', (req, res, next) => {
        console.log("POST POST");
        var post = {};
        console.log(req.body);
        console.log(req.file);
    });

export default router;

вывод req.body равен {}, а req.fileisundefined`.

Я использую реакцию на стороне браузера и загружаю данные через ajax:

  savePost(ev) {
    ev.preventDefault();
    var editor = this.refs.editorDom.getDOMNode();
    var ajaxReq = new AjaxRequest();
    var formData = new FormData();
    formData.append('post_id', this.state.post_id);
    formData.append('title', this.state.title);
    formData.append('author', this.state.author);
    formData.append('digest', this.state.digest);
    formData.append('content', editor.innerHTML);
    formData.append('content_source_url', this.state.content_source_url);
    formData.append('create_time', new Date());
    formData.append('thumb', this.state.thumb);
    ajaxReq.send('post', '/api/post', ()=>{
      if(ajaxReq.getReadyState() == 4 && ajaxReq.getStatus() == 200) {
        var result = JSON.parse(ajaxReq.getResponseText());
        if(result.ok == 1) {
          console.log("SAVE POST SUCCESS");
        }
      }
    }, '', formData);
  }

savePost() — это обратный вызов прослушивателя событий кнопки. Я успешно загрузил данные с грозным. Я только что заменил грозный на мультер, но не могу его получить.

Я не установил свойство типа содержимого. Я нашел в шапке это , multipart/form-data; boundary=----WebKitFormBoundary76s9Cg74EW1B94D9

HTML-код form

<form id="edit-panel" data-reactid=".ygieokt1c0.1.0.1.0.1">
  <div id="title" class="form-group" data-reactid=".ygieokt1c0.1.0.1.0.1.0">
    <input type="text" class="form-control" name="title" value="" data-reactid=".ygieokt1c0.1.0.1.0.1.0.1">
  </div>
  <div id="author" class="form-group" data-reactid=".ygieokt1c0.1.0.1.0.1.1">
    <input type="text" class="form-control" name="author" value="" data-reactid=".ygieokt1c0.1.0.1.0.1.1.1">
  </div>
  <div id="thumb" class="form-group" data-reactid=".ygieokt1c0.1.0.1.0.1.2">
    <button class="btn btn-default" data-reactid=".ygieokt1c0.1.0.1.0.1.2.1">
      <input type="file" name="thumb" accept="image/*" data-reactid=".ygieokt1c0.1.0.1.0.1.2.1.0">
      <span data-reactid=".ygieokt1c0.1.0.1.0.1.2.1.1">UPLOAD</span>
    </button>
  </div>
  <div class="form-group" data-reactid=".ygieokt1c0.1.0.1.0.1.3">
    <textarea class="form-control" name="digest" rows="5" data-reactid=".ygieokt1c0.1.0.1.0.1.3.1"></textarea>
  </div>
  <div id="rich-text-editor" class="form-group" data-reactid=".ygieokt1c0.1.0.1.0.1.4">
    <div id="editor-div" class="form-control" contenteditable="true" data-reactid=".ygieokt1c0.1.0.1.0.1.4.1"></div>
  </div>
  <div id="content-source-url" class="form-group" data-reactid=".ygieokt1c0.1.0.1.0.1.5">
    <input type="text" class="form-control" name="content_source_url" value="" data-reactid=".ygieokt1c0.1.0.1.0.1.5.1">
  </div>
  <button class="btn btn-default" data-reactid=".ygieokt1c0.1.0.1.0.1.6">保存并提交</button>
</form>

Я могу вывести thumb, это объект File{}.

Спасибо за помощь.


person Brick Yang    schedule 17.11.2015    source источник


Ответы (1)


Наконец я обнаружил, что проблема в Content-Type.

Я использовал this.request.setRequestHeader("Content-Type", postDataType); для установки Content-Type и установил postDataType на '', тогда фактическое Content-Type в заголовке равно , multipart/form-data; boundary=----WebKitFormBoundary76s9Cg74EW1B94D9, как я упоминал в начале.

Вы можете видеть запятую и пробел перед multipar/form-data. Я понятия не имею, откуда взялась эта запятая. Но в любом случае, когда я убираю запятую и пробел, все просто отлично работает!

person Brick Yang    schedule 18.11.2015