[英]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.