【问题标题】:Node.js & request module : Start upload from a readable streamNode.js 和请求模块:从可读流开始上传
【发布时间】:2014-09-19 11:27:36
【问题描述】:

当用户在我的 node.js 服务器上上传文件时,我需要将相同的文件上传到另一台服务器。

我想知道是否可以开始将上传的部分发送到第二台服务器,而无需等待文件已完全上传到我的 node.js 服务器上。

我正在使用请求模块https://github.com/mikeal/request 上传到第二台服务器。

下面的代码会等到用户完成上传后再开始第二次上传(尽管我对此不是 100% 确定):

app.post('/upload', function(req, res, next){
    fs.readFile(req.files.file.path, function (err, data) {
        var newName = moment().format('YYYYMMDDHHmmss') + "_" + (Math.floor(Math.random() * (10000 - 0) + 0));
        var name = newName + "." + req.files.file.extension;
        var newPath = "public/uploads/"+name;
        fs.writeFile(newPath, data, function (err) {
            if (err) {
                throw err;
                res.send("error");
            }
            fs.unlink(req.files.file.path, function (err) {
                if (err) response.errors.push("Erorr : " + err);
                console.log('successfully deleted temp file : '+ req.files.file.path );
            });
            var uploadurl = "http://second.server.com/upload;
            var r = request.post(uploadurl, function optionalCallback (err, httpResponse, body) {
                if (err) {
                    return console.error('upload failed:', err);
                }
                console.log('Upload successful!  Server responded with:', body);
            });
            var form = r.form();
            form.append('file', fs.createReadStream(newPath));           
            res.send(newPath);
        });
    });
});

【问题讨论】:

    标签: node.js file-upload request


    【解决方案1】:

    您可以使用busboy 执行此操作(注意:这要求您当前的正文解析中间件不会针对此特定路由运行,否则请求数据将已被消耗):

    var Busboy = require('busboy');
    
    // ...
    
    app.post('/upload', function(req, res, next) {
      var busboy = new Busboy({ headers: req.headers }),
          foundFile = false,
          uploadurl = 'http://second.server.com/upload',
          form,
          r;
    
      busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
        if (foundFile || fieldname !== 'file')
          return file.resume(); // skip files we're not working with
    
        foundFile = true;
    
        r = request.post(uploadurl, function(err, httpResponse, body) {
          if (err)
            return console.error('upload failed:', err);
          console.log('Upload successful!  Server responded with:', body);
        });
    
        form = r.form();
        form.append('file', file);
      }).on('finish', function() {
        res.send('File ' + (foundFile ? '' : 'not ') + 'transferred');
      });
    
      req.pipe(busboy);
    });
    

    【讨论】:

    • 感谢您的回答。由于我对 node.js 和 express 设置比较陌生,你能解释一下我如何绕过这条路由的 express body 解析器吗?或者有没有办法用我当前的代码来实现这一点(我看到请求模块有一些管道功能,req.files.file.path 是一个可读流。而且你的代码似乎没有将文件保存在主服务器上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多