web-dev-qa-db-ja.com

要求ノードフェッチまたはノードでファイルを送信するにはどうすればよいですか?

NodeまたはNode Fetch POST request?でAPIを呼び出そうとしています。 CSVまたはXLSファイルをインポートします。これはNodeまたはNode Fetch?

12
Rocky

README.md 言う:

要求と応答の両方で、本体にネイティブストリームを使用します。

そして ソースはいくつかのタイプをサポートしていることを示します 、たとえばStreamBufferBlob...などであり、またString他のタイプの場合。

以下のスニペットは、v1.7.1または2.0.0-alpha5で動作する3つの例を示します(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オブジェクトを本体として渡します(FormDataは、 Streamlibrary を介して、CombinedStreamの一種です。 =)
  • オプションに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--
22
Hugues M.

node-fetchを使用してmultipart/form-dataおよび GitHubのドキュメントで実際にこれを行う方法 を使用してファイルをアップロードする方法を探していました。以下は、FormDataにバッファをアタッチしてアップロードする方法を示す修正された例です。

const FormData = require('form-data');     
const form = new FormData();

const buffer = // e.g. `fs.readFileSync('./fileLocation');
const fileName = 'test.txt';

form.append('file', buffer, {
  contentType: 'text/plain',
  name: 'file',
  filename: fileName,
});

fetch('https://httpbin.org/post', { method: 'POST', body: form })
    .then(res => res.json())
    .then(json => console.log(json));

私がやったように、「node-fetch upload file multipart」をグーグルで検索した他の人と共有します。

3
Rico Kahler