Node.js express文件上载错误和几个问题
我使用多方处理文件上传 在我的控制器中,我有Node.js express文件上载错误和几个问题,node.js,express,Node.js,Express,我使用多方处理文件上传 在我的控制器中,我有 exports.uploadFile = function(req, res, next) { if (req.files && req.files.file) { var file = req.files.file var tmpPath = file.path var targetDirectory = dir.public + '/upload' var
exports.uploadFile = function(req, res, next) {
if (req.files && req.files.file) {
var file = req.files.file
var tmpPath = file.path
var targetDirectory = dir.public + '/upload'
var targetPath = dir.public + '/upload' + '/' + file.name
if (file.size > config.uploadFileMaxSize) {
fs.unlink(tmpPath, function(err) {
if (err)
return next(err)
return next(helper.getAbuseError('file is too large'))
})
}
else {
fs.mkdir(targetDirectory, function(err) {
if (err && err.code !== 'EEXIST')
return next(err)
fs.rename(tmpPath, targetPath, function(err) {
if (err)
return next(err)
fs.unlink(tmpPath, function(err) {
if (err)
return next(err)
return res.json(helper.dataAppendedWithMessage({path: targetPath}, 'success', 'file uploaded'))
})
})
})
}
}
}
在我的路由器中:
restRouter.post(helper.serverUrl.common.uploadFile,
helper.permission.middleware(helper.accessList.uploadFile),
multiparty(), //Note: only used in file uploads
commonController.uploadFile)
有几个问题
/var/folders
下?从我阅读的所有教程中,它应该存储在[app\u root]/tmp
文件。键入值,但我不想硬编码它。如何检查HTML5标记中是否可以使用文件类型
{path:targetPath}
供客户机标记使用。但是目标路径是/path/to/app\u root/public/upload/xxx.png
,我怎么能只发回/public/upload/xxx.png
?我当然可以搜索public
并去掉/path/to/app\u root/
,但代码会变得很乱。还有其他优雅的方法吗/tmp
后才会调用此函数,攻击者只需上传一个1000GB的文件,就可以轻易地将我的存储空间淹没我给你一个功能可能是这可以帮助你上传文件,虽然我做了图像上传,但很少修改,这可能也为你工作
handleFileUpload: function(req) {
if(!req.files || !req.files.place_img || !req.files.place_img.name) {
return req.body.currentPicture || '';
}
var data = fs.readFileSync(req.files.place_img.path);
var fileName = req.files.place_img.name;
var uid = crypto.randomBytes(10).toString('hex');
var dir = __dirname +"/../public/uploads/" + uid;
fs.mkdirSync(dir, '0777');
fs.writeFileSync(dir + "/" + fileName, data);
return '/uploads/' + uid + "/" + fileName;
}
以下是几个答案:
fs.rename()
将文件从a重命名为B,它不会复制文件。因此,成功重命名后,路径a不再存在,因此您不能(/不必)取消链接李>
/var/folders/XXX/YYY/T
包含“每个用户临时文件和缓存”(请参见$man-hier
),但多方使用os.tmpDir()
,它至少在我的Mac上返回/tmp
(如预期的那样)李>
图像/*
、视频/*
和音频/*
检查内容类型李>
var filePath = '/upload/' + file.name;
var targetPath = dir.public + filePath;
...
res.json({ path: filePath });
连接多方
的任何选项都将传递给引擎盖下的多方
,该引擎盖具有选项。这会将所有文件的上传限制在一定的范围内,但是如果你只上传一个文件,它也应该可以工作李>
为什么要使用readFileSync?在这种情况下,您需要捕获异常吗?我看不出我们的代码之间有任何区别,除了它在我的mac上返回的asyncon
/var/folders
。是mac配置还是express配置?我没有使用节点多方
。我正在使用连接多方
。此外,在用户将文件上载到/tmp
后,将调用多方中间件。如何在中间件内部防止这种情况发生?connectmultiparty
使用节点multiparty
,并负责文件上传处理。至于临时目录:您是使用官方的Node.js还是使用自制软件安装的?也许区别就在于此。我使用自制软件安装it@OMGPOP这可能与此有关。如果确实要使用/tmp
,请设置该选项。