2017-02-22 6 views
0

им triying, чтобы загрузить файл с multer но всегда req.file неопределен и папка назначения пуст:Node.js multer req.file всегда неопределенными

Сервер:

var express = require('express'); 
var multer = require('multer') 
var app = express(); 

    var storage = multer.diskStorage({ 
      destination: function(req, file, cb) { 
       cb(null, './public/uploads/'); // Make sure this folder exists 
      }, 
      filename: function(req, file, cb) { 
          console.log(file) 
       var ext = file.originalname.split('.').pop(); 
       cb(null, file.fieldname + '-' + Date.now() + '.' + ext); 
      } 
     }), 
     upload = multer({ 
      storage: storage 
     }).single('avatar'); 

    app.post('/uploads', upload, (req, res) => { 
     console.log('body', req.body); 
     console.log('file', req.file); 
       res.json("ok") 
    }); 

Клиент:

Я просмотрел множество ответов, но ничего не получилось.

 <form id="myform" encrypt="multipart/form-data"> 
     <label for="userName">Name</label> 
     <input type="text" name="userName"/> 
     <br> 
     <label for="phoneNumber">PhoneNumber</label> 
     <input type="text" name="phoneNumber"/> 
     <br> 
     <label for="file">UploadFile</label> 
     <input type="file" name="avatar"/> 
     <input type="submit"/> 
    </form> 

$('#myForm').submit(function(e){ 

     var formData = new FormData($(this)[0]); 
     $.ajax({ 
      type:'POST', 
      url:'uploads', 
      data : formData, 
      contentType: true, 
      processData: false 
     }).done(function(data){ 
      //print response on success 
      console.log(data); 

     }).fail(function(data) { 
       console.log('Error'); 
      }); 
     e.preventDefault(); 
     }); 

enter image description here Можете ли вы сказать мне, что я делаю неправильно, пожалуйста?

ответ

0

Я нашел ошибку в Аяксе я установить тип содержимого неверно:

$('#myForm').submit(function(e){ 

     var formData = new FormData($(this)[0]); 
     $.ajax({ 
      type:'POST', 
      url:'uploads', 
      data : formData, 
      contentType: false, // <----------------- 
      processData: false 
     }).done(function(data){ 
      //print response on success 
      console.log(data); 

     }).fail(function(data) { 
       console.log('Error'); 
      }); 
     e.preventDefault(); 
     }); 

Благодаря @Marc.

1

Почему вы внедрили $('#myForm').submit(function(e){...})?

У вас есть опечатка в вашем элементе <form>. Атрибут называется enctype, а не «зашифрован». И вы можете просто добавить атрибут method="POST" и удалить все javascript и позволить браузеру загружать.

Пример:

<form method="POST" action="/uploads" enctype="multipart/form-data"> 
..... 
</form> 
+0

Ваш образец работает, большое вам спасибо. Можете ли вы рассказать мне, как я могу уловить ответ? –

+0

Куда вы хотите его поймать? Вы хотите, чтобы браузер оставался на странице с формой загрузки? – Marc

+0

Да, это то, что я хочу, смена браузера на http: // myip/uploads –