2017-05-17 9 views
4

nodejs/node-fetch POSTリクエストでファイルを添付する方法ファイル(.xlsまたはcsv)をインポートするAPIを呼び出したいとします。 Node-fetch/nodejを使用してこれを行うにはどうすればよいですか。リクエストノードフェッチまたはnodejsでファイルを送信する方法

+0

エンドポイントを作成し、ファイルを入力として受け入れ、[node-fetch](https://www.npmjs.com/package)を使用してnodejsサーバーに保存/処理したいとします。/node-fetch)? –

+0

ここでは、nodejsサーバーは関係しません。彼らはnodejsプログラムの中から 'node-fetch'を使ってファイルをサービスにPOSTしたい(サービスは重要ではありません)(そのプログラムはその観点からhttpクライアントになります。それは無関係です)。 –

答えて

8

README.mdは言う:

体のために使用されるネイティブのストリームは、要求と応答の両方で。 StreamBufferBlobのような

そしてsources indicate it supports several types、...と、また他のタイプのStringとして強制しようとします。スニペット以下

3例を示す、V1.7.1または2.0.0-ALPHA5とすべての作業、(さらにFormDataとダウン他の例を参照):

let fetch = require('node-fetch'); 
let fs = require('fs'); 

const stats = fs.statSync("foo.txt"); 
const fileSizeInBytes = stats.size; 

// You can pass any of the 3 objects below as body 
let readStream = fs.createReadStream('foo.txt'); 
//var stringContent = fs.readFileSync('foo.txt', 'utf8'); 
//var bufferContent = fs.readFileSync('foo.txt'); 

fetch('http://httpbin.org/post', { 
    method: 'POST', 
    headers: { 
     "Content-length": fileSizeInBytes 
    }, 
    body: readStream // Here, stringContent or bufferContent would also work 
}) 
.then(function(res) { 
    return res.json(); 
}).then(function(json) { 
    console.log(json); 
}); 

ここでは、foo.txtある:

hello world! 
how do you do? 

注:http://httpbin.org/postは、送信されたリクエストの詳細を含むJSONで返信します。

結果:

{ 
    "args": {}, 
    "data": "hello world!\nhow do you do?\n", 
    "files": {}, 
    "form": {}, 
    "headers": { 
    "Accept": "*/*", 
    "Accept-Encoding": "gzip,deflate", 
    "Connection": "close", 
    "Content-Length": "28", 
    "Host": "httpbin.org", 
    "User-Agent": "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)" 
    }, 
    "json": null, 
    "origin": "86.247.18.156", 
    "url": "http://httpbin.org/post" 
} 

あなたはより多くのパラメータを持つフォームの一部としてファイルを送信する必要がある場合は、あなたが試すことができます:

  • npm install form-data
  • が(体としてFormDataオブジェクトを渡しますFormDataStreamの種類で、CombinedStreamlibraryを経由します)
  • do not pa (上記の例とは異なり)オプションでSS header

、その後、この作品:(ちょうど送られるものを示す)

const formData = new FormData(); 
formData.append('file', fs.createReadStream('foo.txt')); 
formData.append('blah', 42); 
fetch('http://httpbin.org/post', { 
    method: 'POST', 
    body: formData 
}) 

結果:

----------------------------802616704485543852140629 
Content-Disposition: form-data; name="file"; filename="foo.txt" 
Content-Type: text/plain 

hello world! 
how do you do? 

----------------------------802616704485543852140629 
Content-Disposition: form-data; name="blah" 

42 
----------------------------802616704485543852140629-- 
+0

最後の例は私のためのクラッチだった。答えをありがとう。 – davemyron

+0

@Hugues M.あなたはその答えのために大変感謝しています。なぜそれがより多くのアップボーンを持っていないのか分かりません! – Newcomer

0

をこれは、その急行サーバーですローカルファイルを応答にストリームします。

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

express.get('/',function(req,res){ 
    var readStream = fs.createReadStream('./package.json'); 
    readStream.pipe(res); 
}) 
express.listen(2000); 
0

ユーグ・M.の答えに追加する一つのことがあります。 FormDataのファイルアップロードはnode-fetchでサポートされていません。代わりに、requestまたはrequest-promiseなどの他のライブラリを使用する必要があります。以下はrequest-promiseライブラリを使用してファイルをアップロードするためのコードスニペットです。 resolveWithFullResponseオプションを使用すると、生の応答が得られます。これがなければ、約束はただの返答の本文を返します。

let rp = require('request-promise')  

var formData = { 
    file: fs.createReadStream('foo.txt'), 
} 

let options = { 
    uri:'http://httpbin.org/post', 
    formData: formData, 
    resolveWithFullResponse: true 
} 

rp.post(options).then((response) => { 
    // handle response here 
}) 
関連する問題