2016-08-18 71 views
1

我读过request's documentation page一个可以串流文件到PUT或POST请求,就像这样:管道中的流请求后不工作

fs.createReadStream('file.json').pipe(request.put('http://example.com/obj.json')); 
request.get('http://google.com/img.png').pipe(request.put('http://example.com/img.png'));  

但它似乎不工作。我试图设置一个本地服务器来上传使用不同库的文件。

快递-打杂:

var express = require('express'); 
var app = express(); 
var fs = require('fs'); 
var bb = require('express-busboy'); 
var app = express(); 
bb.extend(app, { 
    upload: true, 
    path: './img/', 
    allowedPath: /./ 
}); 

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

var server = app.listen(process.env.PORT, function() { 
    console.log('Listening on port %d', server.address().port); 
}); 

和强大:

var express = require('express'); 
var app = express(); 
var path = require('path');  
var fs = require('fs');  
var formidable = require('formidable'); 

app.post('/upload', function(req, res){ 

    // create an incoming form object 
    var form = new formidable.IncomingForm(); 

    // specify that we want to allow the user to upload multiple files in a single request 
    form.multiples = true; 

    // store all uploads in the /uploads directory 
    form.uploadDir = path.join(__dirname, '/img'); 

    // every time a file has been uploaded successfully, 
    // rename it to it's orignal name 
    form.on('file', function(field, file) { 
     fs.rename(file.path, path.join(form.uploadDir, file.name)); 
    }); 

    // log any errors that occur 
    form.on('error', function(err) { 
     console.log('An error has occured: \n' + err); 
    }); 

    // once all the files have been uploaded, send a response to the client 
    form.on('end', function() { 
     res.end('success'); 
    }); 

    // parse the incoming request containing the form data 
    form.parse(req); 

}); 

var server = app.listen(process.env.PORT, function() { 
    console.log('Listening on port %d', server.address().port); 
}); 

都工作得不错时,我正在要求是这样的:

var request = require('request'); 
var fs = require('fs'); 
var formData = { 
     filename: { 
     value: fs.createReadStream('ice.jpg'), 
     options: { 
     filename: 'ice.jpg', 
     contentType: ' image/jpeg' 
     }} 
    }; 

request.post({url: 'https://myserver.com/upload', formData: formData}); 

或命令行:

curl -i -X POST -H "Content-Type: multipart/form-data" -F "[email protected]" https://myserver.com/upload 

但是,当我试图做到这一点他们没有工作:

fs.createReadStream('ice.jpg').pipe(request.post('https://myserver.com/upload')); 

难道我做错了什么?有没有办法让最后一行工作?

回答

2

好的。如果有人遇到类似问题,我正在回答这个问题。

卷曲request.post与FORMDATA选项同时发送POST请求与“内容类型:多部分/表单数据”头。像express-busboy,强大的多层这样的库被用于解析该数据。

这条线:

fs.createReadStream('ice.jpg').pipe(request.post('https://myserver.com/upload')); 

发送请求与“内容类型:image/JPEG”“传输编码:分块”头。这里不需要解析多部分表单数据。

var http = require('http'); 
var fs = require('fs'); 

var server = http.createServer(function(req, res){ 
    console.log(req.headers); 
    var body = []; 
    req 
     .on('data', chunk => { 
      body.push(chunk); 
      console.log('Chunk ', chunk); 
      }) 
     .on('end',() => { 
      body = Buffer.concat(body); 
      fs.writeFileSync('newfile.jpg', body, null); 
     }); 
    res.write("OK\n"); 
    res.end(); 
}); 

在服务器上下面的代码将在这种情形下工作