使用multer上传时如何限制文件大小?
Posted
技术标签:
【中文标题】使用multer上传时如何限制文件大小?【英文标题】:How to limit the file size when uploading with multer? 【发布时间】:2016-04-14 08:14:28 【问题描述】:我正在用 multer 制作一个简单的文件上传系统:
var maxSize = 1 * 1000 * 1000;
var storage = multer.diskStorage(
destination: function (req, file, callback)
callback(null, 'public/upload');
,
filename: function (req, file, callback)
callback(null, file.originalname);
,
onFileUploadStart: function(file, req, res)
if(req.files.file.length > maxSize)
return false;
);
var upload = multer( storage : storage).single('bestand');
router.post('/upload',function(req,res)
upload(req,res,function(err)
if(err)
return res.end("Error uploading file.");
console.log(req.file);
res.redirect(req.baseUrl);
);
);
这一切正常,文件被上传。唯一不起作用的是最大尺寸的限制。我这样做是为了让 onfileupload start 检查文件的大小,如果它太大,它将返回 false。但是文件仍然刚刚上传。
似乎onFileUploadStart
根本没有做任何事情。我试着console.log
里面的东西,但什么都没有。
我做错了什么?使用 multer 上传时如何限制文件大小?
【问题讨论】:
你在哪里看到需要在偶数onFileUploadStart
的处理程序中返回false
if req.files.file.length > maxSize
?
我正在关注的教程。但我假设你说这不是停止上传的正确方法?
你能console.log
(在 if 语句之前)在同一个处理程序中的文件吗?你看到了什么?
显然也许你应该使用fileFilter
而不是处理偶数onFileUploadStart
(显然文件大小尚不清楚或为0......)顺便说一句......检查这里关于您应该如何限制文件大小:github.com/expressjs/multer/issues/186 如果您解决了问题,我鼓励您回答自己的问题;)
这里还有另一个限制文件大小的示例(除其他外):github.com/expressjs/multer/issues/120:您基本上需要将文件大小指定为您作为属性传递的limits
对象您传递给multer
的对象,即类似var upload = multer( storage : storage, limits: fileSize: maxSize ).single('bestand');
...
【参考方案1】:
新的multer
API 没有onFileUploadStart
。如果你想限制文件大小,你应该将limits: fileSize: maxSize
添加到传递给multer()
的对象中:
var upload = multer(
storage: storage,
limits: fileSize: maxSize
).single('bestand');
【讨论】:
您应该能够添加 Express 错误处理程序并检查err.code === 'LIMIT_FILE_SIZE'
。
@mscdex 我也使用了 fileSize。但我认为超过限制时它不会停止上传。而是上传整个文件然后检查限制。我错过了什么吗?
@JayadrathaMondal 如果你能证明这一点,那么我会说向 github 上的 multer issue tracker 提交问题。
@mscdex 是的,这是一个问题,尝试上传一个您可以理解的 1GB 文件。我与 LinusU(Multer 维护者)进行了交谈。并列出了问题,github.com/expressjs/multer/issues/344。尝试 multer v2.0 alpha。他说它可能会在 v2 中修复
@JayadrathaMondal 问题仍未解决。这个问题有更新吗?最后一次回复是在 3 月,到目前为止,我还没有看到他们正在积极尝试解决此问题的任何内容。【参考方案2】:
我想是你在找。 祝您有美好的一天。
const fileFilter = (req, file, cb) =>
const fileSize = parseInt(req.headers['content-length']);
if((file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/jpeg' || file.mimetype === 'application/octet-stream') && (fileSize <= 1282810))
cb(null, true);
else if(file.mimetype === 'video/mp4' && fileSize <= 22282810)
cb(null, true);
else
cb(null, false);
;
【讨论】:
【参考方案3】:对于将 Multer 与 Ts.ED 一起使用的任何人。当我尝试上传一个太大的文件时(不管它有什么扩展名),我最终出现了以下错误:
无法读取未定义的属性(读取“替换”)
我确实使用了以下代码来解决这个问题:
@Configuration(
...
multer:
limits:
fieldNameSize: 300,
fileSize: 1048576, // 10 Mb
,
fileFilter: (req, file, callback) =>
const acceptableExtensions = ['.png', '.jpg'];
if (!(acceptableExtensions.includes(Path.extname(file.originalname))))
return callback(new Error('...'));
// added this
const fileSize = parseInt(req.headers['content-length']);
if (fileSize > 1048576)
return callback(new Error('...'));
// --
callback(null, true);
)
现在可以了。
【讨论】:
以上是关于使用multer上传时如何限制文件大小?的主要内容,如果未能解决你的问题,请参考以下文章
如何在nodejs中使用sharp调整图像大小然后使用multer上传
如何使用嵌入式 tomcat 在 Spring Boot 中增加文件大小上传限制