繁体   English   中英

Node.js和请求模块:从可读流开始上传

[英]Node.js & request module : Start upload from a readable stream

当用户在我的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);
        });
    });
});

这是使用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);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM