我已经在这个问题上工作了两天了,我被卡住了.我正在使用带有Express的Node.js,我正在尝试实现上传表单.基本上,我希望表单执行以下操作:
检查文件的大小,如果文件过大则取消上传(当我说取消时,我的意思是阻止任何进一步的数据写入磁盘并删除临时文件)
检查文件类型并确认它是正确的类型(.jpg,.png等),如果不是,则停止进一步写入磁盘并删除临时文件.
目前,我有上传工作,当文件太大或与正确类型不匹配时我发出错误,然后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上的文件,它说:
遇到错误的请求会自动暂停,如果您希望请求继续触发"数据"事件,则必须手动调用request.resume().
这将是伟大的,但我似乎无法让它工作.每当我发出"错误"时,"数据"事件会一直持续到完成.
尝试
我已经尝试在发生错误时取消请求,但无济于事.req.pause()
什么也没做对我来说,req.end()
并req.abort()
给了我一个错误说,这是不是一种方法,并req.connection.destroy()
与req.connection.end()
刚送POST请求的循环.
最后的想法
所以我正在寻找它似乎应该是常见的,但我花了最后两天在互联网上搜索彻底的实施,我似乎找不到任何东西.我的意思是,在整个事情上传之后检查文件的大小和类型很简单,但是谁想要浪费所有这些资源?更不用说恶意用户可以做的事情了.
我将继续工作,直到我得到我正在寻找的东西,但我认为这个问题可能与其他一些用户有关,希望我能得到一些帮助!
谢谢你的时间.