我已经在这个问题上进行了两天的研究,但是我被困住了。我将Node.js与Express结合使用,并且试图实现一个上传表单。基本上,我希望表单执行以下操作:
当前,我可以进行上传,当文件太大或与正确的类型不匹配时,我会发出错误消息,然后在将整个文件写入磁盘后,使用
fs.unlink()
删除文件。但是我看到了这种方法的潜在问题:如果用户上传了一个巨大的文件(GB大小)怎么办?现在使用我的方法,最终将其从我的计算机中删除,但不会浪费大量资源。因此,基本上,我希望使用最少的资源,以确认文件可以上传。这是我到目前为止的代码: var path = absolutePath + '/public/images/users/' + req.session.userId + '/';
var maxSize = 3146000; // 3MB
var form = new formidable.IncomingForm();
form.uploadDir = path;
form.keepExtensions = true;
form.on('error', function(message) {
if(message)
{
res.json({err: message});
}
else
{
res.json({err: 'Upload error, please try again'});
}
});
form.on('fileBegin', function(name, file){
if(form.bytesExpected > maxSize)
{
this.emit('error', 'Size must not be over 3MB');
}
});
form.on('file', function(name, file) {
var type = file.type;
type = type.split('/');
type = type[1];
if(type != 'jpeg' && type != 'png' && type != 'gif')
{
this.emit('error', "JPG's, PNG's, GIF's only");
fs.unlink(file.path);
}
else
{
fs.rename(file.path, path + 'profile.' + type);
}
});
form.on('progress', function(bytesReceived, bytesExpected) {
console.log(bytesReceived); //This is just to view progress
});
form.parse(req);
我也很困惑,因为根据https://github.com/felixge/node-formidable上的文档,它说:
这很好,但是我似乎无法使它正常工作。每当我发出“错误”消息时,“数据”事件就会一直触发直到完成。
尝试
发生错误时,我尝试取消请求,但无济于事。
req.pause()
对我无济于事,req.end()
和req.abort()
给了我一个错误,说这不是一个方法,req.connection.destroy()
和req.connection.end()
仅发送了POST请求循环。最终想法
因此,我所寻找的东西似乎应该很平常,但是我花了最后两天的时间在互联网上进行了全面的实现,但似乎找不到任何东西。我的意思是,在上传完整个文件之后,很容易检查文件的大小和类型,但是谁愿意浪费所有这些资源?更不用说恶意用户可以做的事情。
我将继续工作直到获得所需的确切信息,但我认为此问题可能与其他用户有关,希望我能获得帮助!
谢谢你的时间。
最佳答案
一段时间过去了,现在您可以使用multer代替强大的或多方的。 Multer具有所需的内置功能。