Узел Мультер неожиданное поле


Я работаю над загрузкой файла в мое приложение с помощью модуля npm multer.

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

ошибка:

Unexpected field

Error: Unexpected field
    at makeError (c:UsersDevWebstormProjectsCrunchnode_modulesmulterlibmake-error.js:12:13)
    at wrappedFileFilter (c:UsersDevWebstormProjectsCrunchnode_modulesmulterindex.js:39:19)
    at Busboy.<anonymous> (c:UsersDevWebstormProjectsCrunchnode_modulesmulterlibmake-middleware.js:97:7)
    at Busboy.emit (events.js:118:17)
    at Busboy.emit (c:UsersDevWebstormProjectsCrunchnode_modulesmulternode_modulesbusboylibmain.js:31:35)
    at PartStream.<anonymous> (c:UsersDevWebstormProjectsCrunchnode_modulesmulternode_modulesbusboylibtypesmultipart.js:205:13)
    at PartStream.emit (events.js:107:17)
    at HeaderParser.<anonymous> (c:UsersDevWebstormProjectsCrunchnode_modulesmulternode_modulesbusboynode_modulesdicerlibDicer.js:51:16)
    at HeaderParser.emit (events.js:107:17)
    at HeaderParser._finish (c:UsersDevWebstormProjectsCrunchnode_modulesmulternode_modulesbusboynode_modulesdicerlibHeaderParser.js:70:8) 

приложение.js

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

//. . . 

var upload = multer({ dest: 'upload/'});
var type = upload.single('file');

app.post('/upload', type, function (req,res) {
  var tmp_path = req.files.recfile.path;
  var target_path = 'uploads/' + req.files.recfile.name;
fs.readFile(tmp_path, function(err, data)
{
  fs.writeFile(target_path, data, function (err)
  {
    res.render('complete');
  })
});
.hbs
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name='recfile' placeholder="Select file"/>
    <br/>
    <button>Upload</button>
</form>

#Package.json
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "easy-zip": "0.0.4",
    "express": "~4.13.1",
    "hbs": "~3.1.0",
    "less-middleware": "1.0.x",
    "morgan": "~1.6.1",
    "multer": "~1.0.0",
    "serve-favicon": "~2.3.0"
  }
}
7 71

7 ответов:

мы должны убедиться, что тип= файл с атрибутом name должен быть таким же в качестве имени параметра передается в upload.single('attr')

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

/** Permissible loading a single file, 
    the value of the attribute "name" in the form of "recfile". **/
var type = upload.single('recfile');

app.post('/upload', type, function (req,res) {

  /** When using the "single"
      data come in "req.file" regardless of the attribute "name". **/
  var tmp_path = req.file.path;

  /** The original name of the uploaded file
      stored in the variable "originalname". **/
  var target_path = 'uploads/' + req.file.originalname;

  /** A better way to copy the uploaded file. **/
  var src = fs.createReadStream(tmp_path);
  var dest = fs.createWriteStream(target_path);
  src.pipe(dest);
  src.on('end', function() { res.render('complete'); });
  src.on('error', function(err) { res.render('error'); });

});

The <NAME> вы используете в мултэр это upload.single(<NAME>) функция должна быть такой же, как та, которую вы используете в <input type="file" name="<NAME>" ...>.

так что вам нужно изменить

var type = upload.single('file')

до

var type = upload.single('recfile')

в приложения.js

надеюсь, что это помогает.

продолжение ответа Винсента.

не прямой ответ на вопрос, так как вопрос использует форму.

для меня это было не имя входного тега, который использовался, а имя при добавлении файла в formData.

передний конец файла

   var formData = new FormData();
   formData.append('<NAME>',this.new_attachments)

веб-сервис файл:

   app.post('/upload', upload.single('<NAME>'),...

так как 2 изображения загружаются! один с расширением файла, и другой файл без расширения. чтобы удалить tmp_path (файл без расширения)

после
src.pipe(dest);

добавить ниже код

fs.unlink(tmp_path); //deleting the tmp_path

Это для Api, который вы могли бы использовать

 const express        = require('express');
 const bodyParser     = require('body-parser');
 const app = express();
 var multer = require('multer');
 const port = 8000;
 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({ extended: true }));

 app.listen(port, ()=>{
 console.log('We are live on' + port);
 });

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

 app.post('/post', upload.single('file'), function(req, res) {
  console.log(req.file);
 res.send("file saved on server");
 });

Это также отлично работает используется на почтальон но файл не приходит .расширением jpg какие-нибудь советы? Как прокомментировано ниже

это функция по умолчанию multer, если загружает файл без расширения, однако, предоставляет вам объект file, с помощью которого вы можете обновить расширение файла.

var filename = req.file.filename; 
var mimetype = req.file.mimetype; 
mimetype = mimetype.split("/"); 
var filetype = mimetype[1]; 
var old_file = configUploading.settings.rootPathTmp+filename; 
var new_file = configUploading.settings.rootPathTmp+filename+'.'+filetype; 
rname(old_file,new_file);

к сожалению, сообщение об ошибке не дает четкой информации о том, что реальная проблема заключается. Для этого требуется некоторая отладка.

из трассировки стека, вот происхождение ошибки в multer пакет:

function wrappedFileFilter (req, file, cb) {
  if ((filesLeft[file.fieldname] || 0) <= 0) {
    return cb(makeError('LIMIT_UNEXPECTED_FILE', file.fieldname))
  }

  filesLeft[file.fieldname] -= 1
  fileFilter(req, file, cb)
}

и странный (возможно, ошибочный) перевод, примененный здесь, является источником самого сообщения...

'LIMIT_UNEXPECTED_FILE': 'Unexpected field'

filesLeft - это объект, содержащий имя поля, которое ожидает ваш сервер, и file.fieldname содержит имя поля, предоставленного клиентом. Ошибка возникает при несоответствии имени Поля, предоставленного клиентом, и имени Поля, ожидаемого сервером.

решение состоит в том, чтобы изменить имя либо на клиенте, либо на сервере так что оба согласны.

например, при использовании fetch на клиенте...

var theinput = document.getElementById('myfileinput')
var data = new FormData()
data.append('myfile',theinput.files[0])
fetch( "/upload", { method:"POST", body:data } )

и сервер будет иметь маршрут, например следующий...

app.post('/upload', multer(multerConfig).single('myfile'),function(req, res){
  res.sendStatus(200)
}

обратите внимание, что он myfile это общее имя (в данном примере).

в моем случае это происходило потому, что я переименовал параметр swagger.yaml но не перезагрузил страницу документов.

Поэтому я пробовал API с неожиданным входным параметром.
Короче говоря, F5 - это мой друг.