我已经在这个问题上进行了两天的研究,但是我被困住了。我将Node.js与Express结合使用,并且试图实现一个上传表单。基本上,我希望表单执行以下操作:

  • 检查文件的大小,如果文件太大,则取消上载(当我说取消时,我的意思是防止进一步的数据写入磁盘并删除临时文件)
  • 检查文件类型,并确认它是正确的类型(.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上的文档,它说:



    这很好,但是我似乎无法使它正常工作。每当我发出“错误”消息时,“数据”事件就会一直触发直到完成。

    尝试

    发生错误时,我尝试取消请求,但无济于事。 req.pause()对我无济于事,req.end()req.abort()给了我一个错误,说这不是一个方法,req.connection.destroy()req.connection.end()仅发送了POST请求循环。

    最终想法

    因此,我所寻找的东西似乎应该很平常,但是我花了最后两天的时间在互联网上进行了全面的实现,但似乎找不到任何东西。我的意思是,在上传完整个文件之后,很容易检查文件的大小和类型,但是谁愿意浪费所有这些资源?更不用说恶意用户可以做的事情。

    我将继续工作直到获得所需的确切信息,但我认为此问题可能与其他用户有关,希望我能获得帮助!

    谢谢你的时间。

    最佳答案

    一段时间过去了,现在您可以使用multer代替强大的或多方的。 Multer具有所需的内置功能。

    09-30 17:30
    查看更多