2016-08-18 19 views
1

を動作しません。私は1つが、このように、PUTやPOSTリクエストにファイルをストリーミングできるようrequest's documentation pageに読んだ:要求ポストにストリームをパイピングする

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'));  

しかし、それは動作していないことのようです。私は別のライブラリを使用してファイルをアップロードするためのローカルサーバーを設定しようとしました。

特急-busboy:

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 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}); 

またはコマンドラインから:私はこのような要求を作っているとき

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); 
}); 

はどちらも、正常に動作:

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

OK。私は誰かが同様の問題を抱えている場合の質問に答えています。 FORMDATAオプション付き

カールrequest.post両方"のContent-Type:マルチパート/フォームのデータ" でPOSTリクエストを送信ヘッダー。 express-busboy,恐怖症およびmulterのようなライブラリを用いてそのデータを解析する。

このライン:と

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

"画像/ JPEGのContent-Type" とのリクエストを送信します。ヘッダを "転送エンコードチャンク"。ここで複数部分のフォームデータを解析する必要はありません。

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(); 
}); 

サーバー上で次のコードは、このタイプのシナリオで動作します

関連する問題