我正在使用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"
  }
}

当前回答

不同的文件名发布为“recfile”在<input type=“文件”名称=“recfile”占位符=“选择文件”/>和接收为“文件”在upload.single('file')

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

其他回答

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

从堆栈跟踪中,这里是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是一个对象,它包含服务器期望的字段名称和文件。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是通用名(在本例中)。

不同的文件名发布为“recfile”在<input type=“文件”名称=“recfile”占位符=“选择文件”/>和接收为“文件”在upload.single('file')

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

因为2图像正在上传!一个有文件扩展名,另一个没有扩展名。 删除tmp_path(无扩展名文件)

后 src.pipe(dest);

添加以下代码

fs.unlink (tmp_path);//删除tmp_path

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

示例:My FormData Object:

客户端:

formData.append('file', fileBlob);

服务器端:

multer.single('file');

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

所以你需要改变

Var type = upload.single('file')

to

var类型=上传。

在你的app.js中