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

时间:2014-09-19 11:27:37

标签: node.js file-upload request

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

1 个答案:

答案 0 :(得分: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);
});