我正在使用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)
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');
})
});
<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"
}
}
答案 0 :(得分:203)
您在multer的<NAME>
函数中使用的upload.single(<NAME>)
必须与您在<input type="file" name="<NAME>" ...>
中使用的var type = upload.single('file')
相同。
所以你需要改变
var type = upload.single('recfile')
到
LocationManager.getCurrentLocationSync
希望这有帮助。
答案 1 :(得分:78)
我们必须确保带有name属性的type = file应该相同 作为
中传递的参数名称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 :(得分:12)
回答文森特的回答。
由于问题是使用表单,因此不能直接回答问题。
对我来说,它不是所使用的输入标记的名称,而是将文件附加到formData时的名称。
前端档案
app.post('/upload', upload.single('<NAME>'),...
网络服务文件:
qb := db.Table("tableName").Order("columnName").Limit(2).Select("col1, col2")
答案 3 :(得分:3)
因为2张图片正在上传!一个文件扩展名和其他文件没有扩展名。 删除tmp_path(没有扩展名的文件)
之后
src.pipe(dest);
添加以下代码
fs.unlink(tmp_path); //deleting the tmp_path
答案 4 :(得分:3)
对于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的默认功能,但是,它为您提供了文件对象,您可以使用该文件对象更新文件的扩展名。
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 :(得分:1)
不幸的是,错误消息没有提供有关真正问题所在的明确信息。为此,需要进行一些调试。
在堆栈跟踪中,这是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
(在此示例中)。
答案 6 :(得分:1)
在<input type="file" name='recfile' placeholder="Select file"/>
发布为“ recfile ”并在upload.single('file')
解决方案:确保发送和接收的文件都相似upload.single('recfile')
答案 7 :(得分:0)
在我的方案中,这种情况发生了,因为我在swagger.yaml
中重命名了一个参数,但没有重新加载文档页面。
因此我尝试使用意外的输入参数API
长话短说, F5 是我的朋友。
答案 8 :(得分:0)
可能您输入的名称与您在
upload.single('file')
。
答案 9 :(得分:0)
我解决了这个问题,寻找了我在请求中传递的名字
我正在发送邮件:
{thumbbail: <myimg>}
我曾期望:
upload.single('thumbnail')
所以,我确定了应要求发送的名称
答案 10 :(得分:0)