如何在Formidable(Node.js)中取消用户上传?

 Alistar1991_281 发布于 2023-02-11 10:48

我已经在这个问题上工作了两天了,我被卡住了.我正在使用带有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请求的循环.

最后的想法

所以我正在寻找它似乎应该是常见的,但我花了最后两天在互联网上搜索彻底的实施,我似乎找不到任何东西.我的意思是,在整个事情上传之后检查文件的大小和类型很简单,但是谁想要浪费所有这些资源?更不用说恶意用户可以做的事情了.

我将继续工作,直到我得到我正在寻找的东西,但我认为这个问题可能与其他一些用户有关,希望我能得到一些帮助!

谢谢你的时间.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有