我使用NodeJs Multer上传文件。当文件用户尝试上传时,我需要将响应发送回客户端。问题是onFileSizeLimit
只有文件作为参数,我不知道如何向客户端发送响应。我需要做的基本上是如下所示:
app.use('/users/gyms/upload-logo', multer({
// other settings here then:
onFileSizeLimit: function (file) {
// but res (response) object is not existing here
res.json({
message: "Upload failed",
status: MARankings.Enums.Status.FILE_TOO_LARGE
// status: -6
});
}
});
然而 res
对象剂量存在于那里,我想知道向客户发送某种响应的最佳方式是什么。
答案 0 :(得分:4)
试试这个:
app.use('/users/gyms/upload-logo', multer({
// other settings here then:
onFileSizeLimit: function (file) {
// but res (response) object is not existing here
file.error = {
message: "Upload failed",
status: MARankings.Enums.Status.FILE_TOO_LARGE
// status: -6
};
}, onFileUploadComplete: function (file, req, res) {
if (file.error){
res.send(file.error);
}
}
});
答案 1 :(得分:1)
在这种情况下,记住Multer本身只是一个(中间件)函数,Express会调用它来获得响应。
你也许可以试试这个:
app.use('/users/gyms/upload-logo', function(req, res, next) {
var handler = multer({
// other settings here then:
onFileSizeLimit: function (file) {
// res does exist here now :)
res.json({
message: "Upload failed",
status: MARankings.Enums.Status.FILE_TOO_LARGE
// status: -6
});
}
});
handler(req, res, next);
});
这基本上将multer别名变为处理程序,从Express回调中传递req, res, next
,这意味着您可以从Multer的配置中访问req, res, next
个变量。
我还没有对此进行测试,但我认为这个理论很合理!
答案 2 :(得分:1)
这是multer的作者尚未解决的问题。这个github issue有很多关于它的讨论:
答案 3 :(得分:1)
我在当前项目中使用了一项工作
文件:make-middleware.js 在此功能结束时更改“功能完成(错误)”
替换
第52行:onFinished(req, function () { next(err) })
使用:
第52行:onFinished(req, function () { if(err.code == 'LIMIT_FILE_SIZE') { req.fileSizeError = 1; next() } else next(err) })
在app文件中,您可以将代码更改为
app.post('/upload', upload.single('upload'), function (req, res, next) {
if(typeof req.fileSizeError != "undefined") {
res.send({"error":"File too large"});// to display filesize error
} else {
res.send({"file":req.file}); // when file uploaded successfully
}
});
答案 4 :(得分:0)
multer文件对象实际上包含一个属性,指示文件是否超出大小限制。见https://www.npmjs.com/package/multer#multer-file-object
仅接受一个文件,其最大大小为2 MB,名称为" data"我做了这样的事情:
app.use(multer({
dest: "./uploads/",
putSingleFilesInArray: true, // see https://www.npmjs.com/package/multer#putsinglefilesinarray
limits: {
files: 1,
fileSize: 2097152 // 2 MB
}
}));
app.post("/foo", function(request, response) {
if (!request.files.hasOwnProperty("data")) {
// 400 Bad Request
return response.status(400).end();
}
var file = request.files.data[0];
if (file.truncated) {
// 413 Request Entity Too Large
console.log("Request aborted.");
return response.status(413).end();
}
// do stuff with file
});