Web3.Storageにアップロードされたファイルをプログラムから取得する

2022.07.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回の記事ではJSのライブラリを用いてファイルをWeb3.Storageにアップロードしてミオました。

今回はこのアップロードしたファイルの取得をプログラムを用いて行なっていきたいと思います。

過去のアップロードを一覧表示

Listメソッドを用いると、過去にアップロードしたファイル一覧を取得できます。

<clientObject>.list({before, maxResults})

パラメーター

  • before
    • 指定した日付より新しい結果が返されないようにします(ISO8601形式の日付を指定)
  • maxResults
    • list() を呼び出す際に返す最大アップロード数を指定

実行結果

以下のプログラムを実行すると、

const uploads = [];
for await (const item of client.list({ maxResults: 10 })) {
  uploads.push(item);
}
console.log(uploads)
$ node get.js
[
  {
    _id: '315318962270075523',
    type: 'Car',
    name: 'Upload at 2022-06-24T04:02:49.582Z',
    created: '2022-06-24T04:02:12.544+00:00',
    updated: '2022-06-24T04:02:49.582+00:00',
    cid: 'bafybeienn5wsuuu5hf5pmxqdspiye6crvkfb42nfbvd4txr44lgijjjeoa',
    dagSize: 152494698,
    pins: [ [Object], [Object], [Object] ],
    deals: []
  },
  {
    _id: '315318962270063602',
    type: 'Car',
    name: 'no wrap files',
    created: '2022-06-24T02:15:24.949+00:00',
    updated: '2022-06-24T02:15:24.949+00:00',
    cid: 'bafybeicvybw7bmnc7spidcdqhyjigifoctxdwcxquzxpr5qomo5lorka7m',
    dagSize: 123145,
    pins: [],
    deals: []
  },
<<省略>>

このようにAsyncIterableオブジェクトがリストになって返却されてきました

※ データ構造はstatus()メソッドの戻り値と同じです

ファイルを取得する

get()メソッドで指定したCIDのファイルを取得することができます。

<clientObject>.get(<CID>)

実行結果

ファイルオブジェクト

files()メソッドを呼び出すと、要求されたファイルがオブジェクトとして返されます(Array)

以下のプログラムを実行してみます。

const res = await client.get(rootCid); // Web3Response
const files = await res.files(); // Web3File[]
for (const file of files) {
  console.log(`${file.cid} ${file.name} ${file.size}`);
}

Web3Fileが返ってきて、各オブジェクトは、提供されたCIDを使用してCARにアップロードされたファイルを表します

Web3FileはJavascriptのFileを拡張したもので、CIDのプロパティが追加追加されています。

unixFsオブジェクト

unixFsIterator()メソッドというのも利用可能になっています。

これは、要求されたファイルを AsyncIterableオブジェクトとして返します。。各オブジェクトは、提供されたCIDを持つCARでアップロードされたファイルを表します

UnixFS

IPFSにおけるファイル、ディレクトリ、シンボリックリンクを記述するためのプロトコルバッファベースのフォーマットである

です.

unixFSを使用すると、大きなレスポンスや多くのファイルを含むレスポンスが期待できる場合に便利とのことです。

理由としては、すべてのファイルをメモリにバッファしてから返さないからです。その代わり、返される非同期イテレータは各エントリに対してオブジェクトを生成します。

const res = await client.get(cid);
for await (const entry of res.unixFsIterator()) {
  // オブジェクト
    console.log(typeof(entry));

  console.log(entry);
}

イテレータの中身は、

{
  type: 'directory',
  name: 'sub',
  path: 'bafybeicvybw7bmnc7spidcdqhyjigifoctxdwcxquzxpr5qomo5lorka7m/sub',
  cid: CID(bafybeifu5vzim2hyc5cvx4zpi3ifevlxmiytbg6v6qirr7p2tqjzdxisxi),
  content: [AsyncGeneratorFunction: yieldDirectoryContent],
  unixfs: UnixFS {
    type: 'directory',
    data: undefined,
    hashType: undefined,
    fanout: undefined,
    blockSizes: [],
    _originalMode: 0,
    _mode: 493
  },
  depth: 1,
  node: { Data: <Buffer 08 01>, Links: [ [Object] ] },
  size: 0
},

{
  type: 'raw',
  name: 'EuVimtuUYAEL_3l.jpeg',
  path: 'bafybeicvybw7bmnc7spidcdqhyjigifoctxdwcxquzxpr5qomo5lorka7m/sub/EuVimtuUYAEL_3l.jpeg',
  cid: CID(bafkreibw5ggehokunzhrlv73pr2ei3m6ix5zxbuzbjesftvoqmx4c5qlim),
  content: [AsyncGeneratorFunction: contentGenerator],
  depth: 2,
  size: 39797,
  node: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 48 00 48 00 00 ff e2 02 34 49 43 43 5f 50 52 4f 46 49 4c 45 00 01 01 00 00 02 24 61 70 70 6c 04 00 00 00 ... 39747 more bytes>
}

のようなオブジェクトになっていました。

contentはチャンクされたファイルのコンテンツのイテレーターを返します。

for await (const chunk of entry.content()) {
  console.log(`got a chunk of ${chunk.size} bytes of data`);
}

ダウンロードリンク

Web3.Storageにアップロードしたファイルをコンピューターにダウンロードしたり、ブラウザで表示するには、

https://<YOUR CID>.ipfs.dweb.link/<FILE NAME> にアクセスすることで可能となります。

例えばunixFsオブジェクトの中身が以下の場合、

{
  type: 'raw',
  name: 'web3_storage-logo.png',
  path: 'bafybeicvybw7bmnc7spidcdqhyjigifoctxdwcxquzxpr5qomo5lorka7m/web3_storage-logo.png',
  cid: CID(bafkreiec5npj46tzxtzlr3yvmqzxj77l4ggamaxhb2g4mo37sr532zbdnq),
  content: [AsyncGeneratorFunction: contentGenerator],
  depth: 1,
  size: 78132,
  node: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 04 b0 00 00 02 76 08 06 00 00 00 4f 40 7b 5c 00 00 00 09 70 48 59 73 00 00 0e c4 00 00 0e c4 01 ... 78082 more bytes>
}

アクセス先のURLは、

https://bafybeicvybw7bmnc7spidcdqhyjigifoctxdwcxquzxpr5qomo5lorka7m.ipfs.dweb.link/web3_storage-logo.png

となります。

pathの部分からURLを作成することができます(path: <CID>/<FILE NAME>)。

curlコマンドを使って保存するには

curl https://<YOUR CID>.ipfs.dweb.link/<FILE NAME> -o ~/<OUTPUT FILE>

で可能です。

参考

JavaScriptクライアントライブラリ