节点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"
}
}
218539 次浏览
我们必须确保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'); });


});

你在multer的upload.single(<NAME>)函数中使用的<NAME>必须与你在<input type="file" name="<NAME>" ...>中使用的相同。

所以你需要改变

var type = upload.single('file')

var type = upload.single('recfile')

在你的app.js中

因为2图像正在上传!一个有文件扩展名,另一个没有扩展名。 使用实例删除tmp_path(不带扩展名的文件)

后< p >
src.pipe(dest);
< / p >

添加以下代码

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的默认特性,但是,它为您提供了文件对象,您可以使用它更新文件的扩展名。

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);

在我的场景中,这是因为我重命名了swagger.yaml中的一个参数,但没有重载docs页面 因此,我尝试了一个意想不到的输入参数的API 长话短说,F5是我的朋友

接着文森特的回答。

这不是对问题的直接回答,因为这个问题使用了一个表单。

对我来说,使用的不是输入标记的名称,而是将文件追加到formData时的名称。

前端文件

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

Web服务文件:

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

不幸的是,错误消息没有提供关于真正问题的明确信息。为此,需要进行一些调试。

在堆栈跟踪中,下面是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,这是通用名(在本例中)。

可能您给出的名称与您在 upload.single('file') . < / p >

我解决了这个问题,寻找我在请求中传递的名称

我在身体上写道:

{thumbbail: <myimg>}

我被期待着:

upload.single('thumbnail')

因此,我修复了请求发送的名称

不同的文件名张贴为"recfile"在<input type="file" name='recfile' placeholder="Select file"/>和接收为"文件"在upload.single('file')

解决方案:确保发送和接收的文件都类似upload.single('recfile')

在我的例子中,我在不同的视图和不同的路由器文件中有两个表单。第一个路由器使用视图1中的name字段,它的文件名是"inputGroupFile02"。第二个视图有另一个名称用于文件输入。由于某种原因,Multer不允许在不同的视图中设置不同的名称,所以我决定在两个视图中使用相同的名称作为文件输入。

enter image description here

不要使用输入的name属性,而是使用您用来传递文件的键。

示例:My FormData对象:

客户端:

formData.append('file', fileBlob);

服务器端:

multer.single('file');

2022 - 2023的答案

当使用FormData和数组时,multer变量名还必须包括'[]',这在过去不是这样的。

旧的代码:

const multerConfig = upload.fields([
{name: 'photos', maxCount: 20}
])

2022 +代码:

const multerConfig = upload.fields([
{name: 'photos[]', maxCount: 20}
])