Node Неожиданное поле Multer
Я работаю над загрузкой файла в свое приложение с помощью модуля multer npm.
Функция multer, которую я определил, - разрешить загрузку одного файла в файловую систему. Все работает во время работы; проблема заключается в том, что после загрузки файла я получаю сообщение об ошибке ниже. Любые советы оценили, где искать.
Ошибка:
Unexpected field
Error: Unexpected field
at makeError (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-error.js:12:13)
at wrappedFileFilter (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\index.js:39:19)
at Busboy.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-middleware.js:97:7)
at Busboy.emit (events.js:118:17)
at Busboy.emit (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\main.js:31:35)
at PartStream.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\types\multipart.js:205:13)
at PartStream.emit (events.js:107:17)
at HeaderParser.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:51:16)
at HeaderParser.emit (events.js:107:17)
at HeaderParser._finish (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:70:8)
app.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');
})
});
Index.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"
}
}
Ответы
Ответ 1
Мы должны убедиться, что type = file с атрибутом 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'); });
});
Ответ 2
<NAME>
, который вы используете в функции multer upload.single(<NAME>)
, должен быть таким же, как тот, который вы используете в <input type="file" name="<NAME>" ...>
.
Итак, вам нужно изменить
var type = upload.single('file')
к
var type = upload.single('recfile')
в вашем приложении app.js
Надеюсь, что это поможет.
Ответ 3
Последующий ответ винсенту.
Не прямой ответ на вопрос, так как вопрос использует форму.
Для меня это было не имя тега ввода, которое использовалось, а имя при добавлении файла в formData.
файл внешнего интерфейса
var formData = new FormData();
formData.append('<NAME>',this.new_attachments)
файл веб-службы:
app.post('/upload', upload.single('<NAME>'),...
Ответ 4
Для 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");
});
Это также отлично работает на Postman
но файл не поставляется с расширением .jpg
любой совет?
Как указано ниже
Это функция по умолчанию для multer, если файл upload без расширения, однако, предоставляет вам файл-объект, с помощью которого вы можете обновить расширение файла.
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);
Ответ 5
поскольку 2 изображения загружаются! один с расширением файла и другим файлом без расширения.
для удаления tmp_path (файл без расширения)
после
src.pipe(dest);
добавить ниже код
fs.unlink(tmp_path); //deleting the tmp_path
Ответ 6
К сожалению, сообщение об ошибке не дает четкой информации о реальной проблеме. Для этого требуется некоторая отладка.
Исходя из трассировки стека, здесь источник ошибки в пакете 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
, которое является общим именем (в этом примере).
Ответ 7
В моем сценарии это происходило потому, что я переименовал параметр в swagger.yaml
, но не перезагружал страницу документации.
Поэтому я пробовал API с неожиданным входным параметром.
Короче говоря, F5 мой друг.
Ответ 8
вероятно, вы не даете такое же имя, как вы упомянули в
upload.single('file')
.
Ответ 9
Я решаю эти проблемы в поисках имени, которое я передал по запросу
Я отправил на тело:
{thumbbail: <myimg>}
и я должен был:
upload.single('thumbnail')
итак, я исправляю имя, которое отправляю по запросу