Я работаю над загрузкой файла в свое приложение с помощью модуля 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"
}
}
Функция, которую
<NAME>
вы используете вupload.single(<NAME>)
функции multer, должна быть такой же, как та, которую вы используете<input type="file" name="<NAME>" ...>
.Итак, вам нужно изменить
var type = upload.single('file')
в
var type = upload.single('recfile')
в тебе app.js
Надеюсь это поможет.
источник
Продолжение ответа Винсента.
Это не прямой ответ на вопрос, так как вопрос использует форму.
Для меня использовалось не имя входного тега, а имя при добавлении файла в formData.
файл переднего плана
файл веб-службы:
источник
formData
имя ключа совпадает сupload
ключевым аргументом. Это работает для меня сейчас.поскольку загружаются 2 изображения! один с расширением файла и другой файл без расширения. удалить tmp_path (файл без расширения)
после
src.pipe(dest);
добавить ниже код
fs.unlink(tmp_path); //deleting the tmp_path
источник
Это для Api, которое вы могли бы использовать
Это также отлично работает в Postman, но файл не имеет расширения .jpg. Как прокомментировано ниже
Это функция Multer по умолчанию, если загружает файл без расширения, однако предоставляет вам объект файла, с помощью которого вы можете обновить расширение файла.
источник
К сожалению, сообщение об ошибке не дает четкой информации о реальной проблеме. Для этого требуется некоторая отладка.
Из трассировки стека выясняется источник ошибки в
multer
пакете:И примененный здесь странный (возможно, ошибочный) перевод является источником самого сообщения ...
filesLeft
- это объект, который содержит имя поля, ожидаемого вашим сервером, иfile.fieldname
имя поля, предоставленного клиентом. Ошибка возникает, когда есть несоответствие между именем поля, предоставленным клиентом, и именем поля, ожидаемым сервером.Решение состоит в том, чтобы изменить имя на клиенте или сервере. чтобы они согласились.
Например, при использовании
fetch
на клиенте ...И у сервера будет такой маршрут, как следующий ...
Обратите внимание, что это
myfile
общее имя (в этом примере).источник
Я решаю эту проблему, ища имя, которое я передал по моему запросу
Я отправлял на теле:
и я ожидал:
Итак, я исправляю имя, которое отправляю по запросу
источник
Другое имя файла, которое было отправлено как " recfile " в
<input type="file" name='recfile' placeholder="Select file"/>
и получено как " файл " вupload.single('file')
Решение : убедитесь, что отправленный и полученный файл похожи
upload.single('recfile')
источник
В моем сценарии это происходило из-за того, что я переименовал параметр в,
swagger.yaml
но не перезагружал страницу документации.Следовательно, я пробовал использовать API с неожиданным входным параметром.
Короче говоря, F5это мой друг.
источник
вероятно, вы не даете то же имя, которое вы упомянули в
upload.single('file')
.источник
В моем случае у меня было 2 формы в разных представлениях и разных файлах маршрутизатора. Первый маршрутизатор использовал поле имени с представлением один, а его имя файла было "inputGroupFile02". Второй вид имел другое имя для ввода файла. По какой-то причине Multer не позволяет вам устанавливать разные имена в разных представлениях, поэтому я решил использовать одно и то же имя для ввода файла в обоих представлениях.
источник