· Nacho Coll · Tutorials · 15 分で読了
2026年版 IPFSにファイルをアップロードする方法 — 完全ガイド
ダッシュボード、REST API、JavaScript、Pythonを使ってJSON、画像、PDF、その他あらゆるファイルをIPFSにアップロードする方法を学びます。コード例付きのステップバイステップガイド。

2026年版 IPFSにファイルをアップロードする方法 — 完全ガイド
単一の企業に制御されず、誰でも検証可能で、検閲に耐えられる方法でファイルを保存したいと考えたことがあるなら、InterPlanetary File System(IPFS)が答えです。このガイドでは、シンプルなドラッグアンドドロップのダッシュボードから、JavaScriptとPythonでの本番環境対応コードまで、IPFSにファイルをアップロードするためのあらゆる実用的な方法をご紹介します。

IPFSとは何か、なぜ使うべきか?
IPFSは、ファイルを保存および共有するためのピアツーピアプロトコルです。コンテンツの場所(特定のサーバー上のURL)でアドレス指定するのではなく、IPFSはコンテンツが何であるかでアドレス指定します。すべてのファイルは、そのコンテンツの暗号学的ハッシュから導出された一意の**コンテンツ識別子(CID)**を取得します。この設計により、従来のホスティングでは実現できない3つの特性が得られます。
- コンテンツアドレッシング。CIDは、受信したデータが正確にアップロードされたデータであることを保証します。1バイトでも変更されると、CIDが変わります。誰もアドレスを無効化することなくファイルを改ざんすることはできません。
- 永続性。ネットワーク上の少なくとも1つのノードがファイルをピン留めしている限り、ファイルは利用可能なままです。IPFS Ninjaのようなピン留めサービスは、独自のインフラを運用することなくファイルをオンラインに保ちます。なぜピン留めが重要で、ガベージコレクションがどのように機能するかについては、IPFSピン留めとは?をご覧ください。
- 検閲耐性。IPFS上のファイルは、単一のドメインやサーバーに縛られません。政府や企業がシャットダウンできる単一障害点はありません。
一般的なユースケースには、NFTのメタデータとメディア、分散型アプリケーションのアセット、科学的データセット、公的記録、そしてデータの整合性が重要なあらゆるシナリオが含まれます。
前提条件
何かをアップロードする前に、2つのものが必要です。
IPFS Ninjaアカウント。https://ipfs.ninja/signupで無料サインアップ。無料プランでは500ファイルと1GBのストレージが提供されます — 始めるのに十分以上です。
APIキー。サインイン後、ダッシュボードのAPI Keysセクションに移動し、新しいキーを生成します。
bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6のような形式になります(プレフィックスbws_a1b2c3d4は識別のためにダッシュボードに表示されます)。このキーは秘密にしてください。すべてのAPIリクエストでX-Api-Keyヘッダーに渡します。
Webダッシュボードのみを使用する場合はAPIキーステップをスキップできますが、APIキーを持っていると独自のアプリケーションからプログラム的にアップロードできるようになります。
方法1: Webダッシュボード(ドラッグアンドドロップ)
ファイルをアップロードする最も速い方法は、IPFS Ninjaダッシュボードを使うことです。
- https://ipfs.ninja/uploadに移動してサインインします。
- JSON、PNG、JPEG、PDF、SVGなど、任意のファイルをアップロードエリアにドラッグアンドドロップするか、クリックしてファイルシステムを参照します。
- オプションで、ファイルを後で整理するのに役立つ説明とメタデータ(キーと値のペア)を追加します。
- アップロードをクリックします。数秒以内にファイルがIPFSにピン留めされ、CIDとゲートウェイURLが提供されます。
この方法はあらゆるファイル形式をサポートし、コードを必要としません。ワンオフのアップロード、簡単なテスト、またはコンテンツをピン留めする必要がある非技術的なチームメンバーに最適です。
方法2: curlでのREST API
自動化とスクリプティングには、REST APIが最も直接的なアプローチです。エンドポイントは次のとおりです。
POST https://api.ipfs.ninja/upload/newすべてのリクエストには、X-Api-Keyヘッダーとcontentフィールドを含むJSON本体が必要です。
JSONのアップロード
JSONオブジェクトをアップロードするには、それを直接contentの値として渡します。
curl -X POST https://api.ipfs.ninja/upload/new \
-H "Content-Type: application/json" \
-H "X-Api-Key: bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" \
-d '{
"content": {
"name": "Astro Cat #42",
"description": "A fearless cat exploring the cosmos.",
"image": "ipfs://bafkreigh2akiscaildc7lqnpfuh3sksq4ogrtz7tpk2aulid5fhqotmqm",
"attributes": [
{ "trait_type": "Background", "value": "Nebula" },
{ "trait_type": "Helmet", "value": "Gold" }
]
},
"description": "NFT metadata for Astro Cat #42",
"metadata": { "collection": "astro-cats", "tokenId": "42" }
}'descriptionとmetadataフィールドはオプションです。これらはファイルと共にIPFS Ninjaのダッシュボードとそしてアップロードを後で識別およびフィルタリングするためのAPIレスポンスに保存されます。これらはIPFSにピン留めされるコンテンツには含まれません。
画像(バイナリファイル)のアップロード
画像やPDFのようなバイナリファイルの場合、ファイルをbase64エンコードし、エンコードされた文字列をcontentとして渡します。
curl -X POST https://api.ipfs.ninja/upload/new \
-H "Content-Type: application/json" \
-H "X-Api-Key: bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" \
-d "{
\"content\": \"$(base64 -w 0 photo.png)\",
\"description\": \"Product photo for landing page\",
\"metadata\": { \"project\": \"website-redesign\" }
}"APIはコンテンツタイプを自動的に検出します。JSON、画像、PDFのいずれをアップロードしているかを指定する必要はありません — サービスが処理します。
方法3: JavaScript / Node.js
組み込みのfetch API(Node.js 18+またはモダンブラウザ)を使用すると、IPFSへのアップロードはわずか数行で行えます。
JSONのアップロード
const API_KEY = "bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6";
const metadata = {
name: "Astro Cat #42",
description: "A fearless cat exploring the cosmos.",
image: "ipfs://bafkreigh2akiscaildc7lqnpfuh3sksq4ogrtz7tpk2aulid5fhqotmqm",
attributes: [
{ trait_type: "Background", value: "Nebula" },
{ trait_type: "Helmet", value: "Gold" },
],
};
const response = await fetch("https://api.ipfs.ninja/upload/new", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": API_KEY,
},
body: JSON.stringify({
content: metadata,
description: "NFT metadata for Astro Cat #42",
}),
});
const result = await response.json();
console.log("CID:", result.cid);
console.log("Gateway URL:", result.uris.url);バイナリファイルのアップロード
import { readFileSync } from "node:fs";
const API_KEY = "bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6";
const fileBuffer = readFileSync("photo.png");
const base64Content = fileBuffer.toString("base64");
const response = await fetch("https://api.ipfs.ninja/upload/new", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": API_KEY,
},
body: JSON.stringify({
content: base64Content,
description: "Product photo",
metadata: { project: "website-redesign" },
}),
});
const result = await response.json();
console.log("CID:", result.cid);
console.log("IPFS URI:", result.uris.ipfs);
console.log("Gateway URL:", result.uris.url);エラー処理付きの一括アップロード
本番環境では、多くのファイルをアップロードする必要があることがよくあります。これは再試行機能付きの再利用可能なヘルパーです。
import { readFileSync } from "node:fs";
const API_KEY = "bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6";
const API_URL = "https://api.ipfs.ninja/upload/new";
async function uploadToIPFS(content, options = {}) {
const body = { content };
if (options.description) body.description = options.description;
if (options.metadata) body.metadata = options.metadata;
const response = await fetch(API_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": API_KEY,
},
body: JSON.stringify(body),
});
if (!response.ok) {
const error = await response.text();
throw new Error(`Upload failed (${response.status}): ${error}`);
}
return response.json();
}
// Upload JSON
const jsonResult = await uploadToIPFS(
{ name: "My Data", values: [1, 2, 3] },
{ description: "Sample dataset" }
);
// Upload image
const imageBase64 = readFileSync("banner.jpg").toString("base64");
const imageResult = await uploadToIPFS(imageBase64, {
description: "Banner image",
metadata: { format: "jpg", width: "1200" },
});
console.log("JSON CID:", jsonResult.cid);
console.log("Image CID:", imageResult.cid);方法4: Python
Pythonのrequestsライブラリを使用すると、IPFSアップロードが簡単になります。
JSONのアップロード
import requests
API_KEY = "bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
API_URL = "https://api.ipfs.ninja/upload/new"
headers = {
"Content-Type": "application/json",
"X-Api-Key": API_KEY,
}
payload = {
"content": {
"name": "Astro Cat #42",
"description": "A fearless cat exploring the cosmos.",
"image": "ipfs://bafkreigh2akiscaildc7lqnpfuh3sksq4ogrtz7tpk2aulid5fhqotmqm",
"attributes": [
{"trait_type": "Background", "value": "Nebula"},
{"trait_type": "Helmet", "value": "Gold"},
],
},
"description": "NFT metadata for Astro Cat #42",
"metadata": {"collection": "astro-cats", "tokenId": "42"},
}
response = requests.post(API_URL, json=payload, headers=headers)
result = response.json()
print(f"CID: {result['cid']}")
print(f"Gateway URL: {result['uris']['url']}")バイナリファイルのアップロード
import base64
import requests
API_KEY = "bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
API_URL = "https://api.ipfs.ninja/upload/new"
headers = {
"Content-Type": "application/json",
"X-Api-Key": API_KEY,
}
with open("photo.png", "rb") as f:
encoded = base64.b64encode(f.read()).decode("utf-8")
payload = {
"content": encoded,
"description": "Product photo",
"metadata": {"project": "website-redesign"},
}
response = requests.post(API_URL, json=payload, headers=headers)
result = response.json()
print(f"CID: {result['cid']}")
print(f"Size: {result['sizeMB']} MB")
print(f"IPFS URI: {result['uris']['ipfs']}")
print(f"Gateway URL: {result['uris']['url']}")一括アップロード
import base64
from pathlib import Path
import requests
API_KEY = "bws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
API_URL = "https://api.ipfs.ninja/upload/new"
HEADERS = {"Content-Type": "application/json", "X-Api-Key": API_KEY}
def upload_file(file_path, description=None, metadata=None):
with open(file_path, "rb") as f:
encoded = base64.b64encode(f.read()).decode("utf-8")
payload = {"content": encoded}
if description:
payload["description"] = description
if metadata:
payload["metadata"] = metadata
response = requests.post(API_URL, json=payload, headers=HEADERS)
response.raise_for_status()
return response.json()
# Upload all PNGs in a directory
for png in Path("./images").glob("*.png"):
result = upload_file(png, description=f"Image: {png.name}")
print(f"{png.name} -> {result['cid']}")レスポンスの理解
成功したアップロードはすべて、次のフィールドを持つJSONオブジェクトを返します。
{
"cid": "bafkreigh2akiscaildc7lqnpfuh3sksq4ogrtz7tpk2aulid5fhqotmqm",
"sizeMB": 0.024,
"uris": {
"ipfs": "ipfs://bafkreigh2akiscaildc7lqnpfuh3sksq4ogrtz7tpk2aulid5fhqotmqm",
"url": "https://ipfs.ninja/ipfs/bafkreigh2akiscaildc7lqnpfuh3sksq4ogrtz7tpk2aulid5fhqotmqm"
}
}| フィールド | 説明 |
|---|---|
cid | コンテンツ識別子 — ファイルの内容の一意のハッシュ。これはIPFS上のファイルの永続的なアドレスです。 |
sizeMB | アップロードされたファイルのサイズ(メガバイト単位)。 |
uris.ipfs | IPFSネイティブURI(ipfs://CID)。スマートコントラクト、NFTメタデータ、または他のIPFS対応アプリケーションからファイルを参照するときに使用します。 |
uris.url | 任意のブラウザで開くことができる直接のHTTPSゲートウェイURL。共有、ウェブサイトへの埋め込み、または迅速な検証に最適です。 |
ファイルへのアクセス
ファイルがピン留めされると、それを取得する主な方法は2つあります。
専用ゲートウェイ
すべてのIPFS Ninjaアカウントには、カスタムスラッグを持つ専用ゲートウェイが含まれています。
https://your-slug.gw.ipfs.ninja/ipfs/{CID}専用ゲートウェイは、IPFS Ninjaのピン留めインフラに直接接続するため、パブリックゲートウェイよりも高速で信頼性が高いです。アップロードレスポンスのCIDを使用して、専用ゲートウェイ経由でファイルにアクセスできます。
パブリックIPFSゲートウェイ
任意のIPFSゲートウェイは、CIDを使用してコンテンツを配信できます。
https://ipfs.ninja/ipfs/{CID} ← あなたの専用ゲートウェイ
https://dweb.link/ipfs/{CID} ← パブリックゲートウェイ
https://w3s.link/ipfs/{CID} ← パブリックゲートウェイパブリックゲートウェイは、IPFS Ninjaネットワーク外からコンテンツが到達可能かどうかを確認したいときに役立ちます。専用ゲートウェイと比較して、遅い場合やレート制限がある場合があることを覚えておいてください。
スマートコントラクトとdAppから
オンチェーンで参照を保存する場合(たとえばERC-721トークンURIで)、ipfs:// URIを使用します。
ipfs://bafkreigh2akiscaildc7lqnpfuh3sksq4ogrtz7tpk2aulid5fhqotmqmウォレット、マーケットプレイス、その他のIPFS対応アプリケーションは、利用可能な任意のゲートウェイを介してこのURIを解決する方法を知っています。
ベストプラクティス
個々のファイルを100 MB以下に保つ。APIはより大きなアップロードを受け入れますが、より小さなファイルはより速くピン留めされ、IPFSネットワーク全体でより効率的にレプリケートされます。大規模なデータセットを扱う場合は、より小さなチャンクに分割してください。
説明的なメタデータを使用する。descriptionとmetadataフィールドは無料で、アップロードを後で管理するのがはるかに簡単になります。プロジェクト名、バージョン番号、または検索とフィルタリングに役立つ任意の識別子を含めます。
CIDを自分のデータベースに保存する。IPFS Ninjaがアップロード履歴を保存していても、CIDとアプリケーションレベルの識別子(ユーザーID、注文番号、トークンID)のマッピングを独自に維持することで、統合がより回復力を持つようになります。
オンチェーン参照にはIPFS URIを使用する。スマートコントラクトや不変のレコードでは、HTTPSゲートウェイURLではなく、常にipfs://CIDを保存してください。ゲートウェイURLは変わる可能性がありますが、CIDは変わりません。
構造化データにはJSONコンテンツを優先する。データが構造化されている場合(メタデータ、構成、レコード)、文字列としてエンコードするのではなく、JSONオブジェクトとして渡します。APIはより効率的に保存し、結果のIPFSコンテンツは人間が読める形式になります。
エラーを優雅に処理する。HTTPステータスコードを確認し、5xxレスポンスには指数バックオフを使用した再試行を実装します。APIは4xxレスポンス(無効なAPIキー、コンテンツの欠落、クレジット不足)に対して明確なエラーメッセージを返すため、これらをユーザーに表示する必要があります。
結論
IPFSへのファイルのアップロードがこれほど簡単だったことはありません。ビジュアルダッシュボード、迅速なcurlコマンド、またはJavaScriptやPythonでの本番グレードの統合のいずれを好む場合でも、IPFS Ninjaは、すべてのコンテンツタイプにわたって単一のエンドポイントと一貫した体験を提供します。
無料のDharmaプランには、50ファイル、1GBのストレージ、月2GBの帯域幅が含まれており、エンドツーエンドで統合を構築およびテストするのに十分です。スケールする準備ができたら、月額5ドルのBodhiプラン、月額19ドルのKarmaプラン、月額59ドルのNirvanaプランでは、より高い制限、専用ゲートウェイ、(Nirvanaでは)優先サポートが提供されます。
無料アカウントを作成して、1分以内にIPFSへのファイルのアップロードを開始してください。
署名トークンとクライアントサイドアップロードを使用したより詳細なAPIウォークスルーについては、IPFS Upload APIチュートリアルを参照してください。ファイルのリスト、APIキーの管理、ゲートウェイの構成を含む完全なAPIリファレンスについては、ドキュメントをご覧ください。

