2016-08-18 70 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(); 
}); 

在服務器上下面的代碼將在這種情形下工作