我已经研究这个问题两天了,但我被困住了。我正在使用 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 https://github.com/felixge/node-formidable, 它说:
遇到错误的请求会自动暂停,如果您希望请求继续触发“数据”事件,则必须手动调用 request.resume()。
这太好了,但我似乎无法让它发挥作用。每当我发出“错误”时,“数据”事件就会不断触发,直到完成。
Attempts
我尝试在发生错误时取消请求,但无济于事。req.pause()
没有为我做任何事req.end()
and req.abort()
给了我一个错误,说它不是一种方法,并且req.connection.destroy()
and req.connection.end()
刚刚发送了一个 POST 请求循环。
最后的想法
所以我正在寻找的东西似乎应该是常见的,但我花了两天的时间在互联网上搜索彻底的实现,但我似乎找不到任何东西。我的意思是,在整个文件上传后检查文件的大小和类型很简单,但谁愿意浪费所有这些资源呢?更不用说恶意用户可以做的事情了。
我将继续工作,直到我得到我想要的东西,但我认为这个问题可能与其他一些用户相关,希望我能得到一些帮助!
谢谢你的时间。