Max*_*Max 5 file-upload node.js
我使用express/formidable在node.js中创建了一个上传脚本.它基本上有效,但我想知道在何时何地检查上传的文件,例如最大文件大小或文件的mimetype是否实际允许.
我的程序看起来像这样:
app.post('/', function(req, res, next) {
req.form.on('progress', function(bytesReceived, bytesExpected) {
// ... do stuff
});
req.form.complete(function(err, fields, files) {
console.log('\nuploaded %s to %s', files.image.filename, files.image.path);
// ... do stuff
});
});
Run Code Online (Sandbox Code Playgroud)
在我看来,检查mimetype /文件大小的唯一可行的地方是complete我可以可靠地使用文件系统函数来获取上传文件大小的事件/tmp/- 但这似乎不是一个好主意,因为:
什么是实施这个的最佳实践?我在node.js中找到了很多文件上传的例子,但似乎没有人做我需要的安全检查.
在节点 IRC 和节点邮件列表的一些人的帮助下,我做的是:
我正在使用强大的来处理文件上传。使用该progress事件,我可以像这样检查最大文件大小:
form.on('progress', function(bytesReceived, bytesExpected) {
if (bytesReceived > MAX_UPLOAD_SIZE) {
console.log('### ERROR: FILE TOO LARGE');
}
});
Run Code Online (Sandbox Code Playgroud)
可靠地检查 mimetype 要困难得多。基本的想法是使用progress事件,然后如果上传了足够的文件,则使用file --mime-type调用并检查该外部命令的输出。简化后看起来像这样:
// contains the path of the uploaded file,
// is grabbed in the fileBegin event below
var tmpPath;
form.on('progress', function validateMimetype(bytesReceived, bytesExpected) {
var percent = (bytesReceived / bytesExpected * 100) | 0;
// pretty basic check if enough bytes of the file are written to disk,
// might be too naive if the file is small!
if (tmpPath && percent > 25) {
var child = exec('file --mime-type ' + tmpPath, function (err, stdout, stderr) {
var mimetype = stdout.substring(stdout.lastIndexOf(':') + 2, stdout.lastIndexOf('\n'));
console.log('### file CALL OUTPUT', err, stdout, stderr);
if (err || stderr) {
console.log('### ERROR: MIMETYPE COULD NOT BE DETECTED');
} else if (!ALLOWED_MIME_TYPES[mimetype]) {
console.log('### ERROR: INVALID MIMETYPE', mimetype);
} else {
console.log('### MIMETYPE VALIDATION COMPLETE');
}
});
form.removeListener('progress', validateMimetype);
}
});
form.on('fileBegin', function grabTmpPath(_, fileInfo) {
if (fileInfo.path) {
tmpPath = fileInfo.path;
form.removeListener('fileBegin', grabTmpPath);
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4708 次 |
| 最近记录: |