【问题标题】:How to do upload with express in node.js如何在 node.js 中使用 express 上传
【发布时间】:2012-12-11 06:29:51
【问题描述】:

我的代码是这样的:

app.configure(function () {
    app.use(express.static(__dirname + "/media"));
    app.use(express.bodyParser({
          keepExtensions: true
    }));
})

app.post('/upload', function (req, res) {
    console.log(req.files);

    res.send("well done");
    return;
})

蚂蚁做一些工作,比如:

1.Do someting on the progoress event,如何将handler绑定到progress,complete事件,我试过req.files.on('progress', fn),但是不行

2 我知道如何使用req.files 来获取文件的信息, 但是如何在上传前限制上传文件的大小,或者限制上传图片的分辨率?

【问题讨论】:

    标签: node.js file-upload express


    【解决方案1】:

    你应该看看multipart middleware documentation,这是涉及文件上传的那个。

    它表示限制是通过“限制”选项设置的,如果将“延迟”选项设置为 true,则可以收听进度。在这种情况下,上传使用的表单被设置为您请求的属性。然后你就可以收听progress event了。

    所以您的代码应该如下所示(尚未测试):

    app.configure(function () {
        app.use(express.static(__dirname + "/media"));
        app.use(express.bodyParser({
              keepExtensions: true,
              limit: 10000000, // 10M limit
              defer: true              
        }));
    })
    
    app.post('/upload', function (req, res) {
        req.form.on('progress', function(bytesReceived, bytesExpected) {
            console.log(((bytesReceived / bytesExpected)*100) + "% uploaded");
        });
        req.form.on('end', function() {
            console.log(req.files);
            res.send("well done");
        });
    })
    

    【讨论】:

    • 关于如何将进度发送给客户端的任何提示?我是否需要保存百分比并从客户端执行手动 GET 请求以请求百分比?
    【解决方案2】:

    我的项目中有一个加载文件的函数,可能会对您有所帮助:

    var app = express.createServer(
        express.bodyParser({uploadDir: "public/files", keepExtensions: true})
      , express.cookieParser()
      , express.session({ secret: 'keyboard cat' })
    );
    
    app.post('/upload', function (req, res) {
    var msg = '';
    var img = '';
    
    //console.log("type: "+req.files.image.type);
    //console.log("size: "+req.files.image.size);
    
    if(req.files.image.type != 'image/png' && req.files.image.type != 'image/jpeg' && req.files.image.type != 'image/gif')
    {
        msg = 'Invalid format, accepts only: jpg, png and gif.<br/>';
    }
    
    if(req.files.image.size > 307200) // 300 * 1024
    {
        msg += 'File size no accepted. Máx: 300kb.<br/>';
    }
    
    if(msg == '')
    {
        if(diff > 0)
        {
            name = name.substring(name.length-diff, name.length);
        }
    
        var date = new Date();
        var name = req.files.image.name;
        var diff = name.length - 20;
        var rnd_number = Math.floor(Math.random()*101);
        var new_name = date.format('yyyymmdd_HHMMssl_') + rnd_number +'_'+ name;
    
        fs.renameSync(req.files.image.path, 'public/files/img'+new_name);
    
        img = '<img src="public/files/img/'+new_name+'" width="100%"/>';
    }
    
    res.render('admin/upload', {layout: false, img: img, msg: msg});
    
    })
    

    【讨论】:

      猜你喜欢
      • 2018-12-17
      • 2015-09-06
      • 1970-01-01
      • 2011-07-06
      • 2012-07-02
      • 2021-03-26
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多