Skip to content

Ordner ​

Ordner organisieren Ihre hochgeladenen Dateien im Dashboard. Sie sind standardmäßig reine Metadaten — Dateien behalten ihre eigenen CIDs und werden auf IPFS nicht verschoben —, aber Sie können einen Ordner auch snapshotten, um ihn als echtes UnixFS-Verzeichnis zu materialisieren und einen einzigen CID für das Ganze zu erhalten.

Wann Sie einen Ordner snapshotten sollten ​

Ein Ordner-Snapshot ist ein einzelner IPFS-Verzeichnis-CID, der jede Datei im Ordner enthält, adressierbar nach Name. Damit können Sie:

  • Den gesamten Ordner über eine einzige URL teilen: https://ipfs.ninja/ipfs/{dirCid}/
  • https://ipfs.ninja/ipfs/{dirCid}/photo.jpg (oder jedes andere Gateway) direkt auflösen
  • Den CID in einen ENS-Contenthash einfügen, um eine statische Website zu hosten
  • Ihn als Basis-CID einer NFT-Sammlung verwenden, sodass jedes Token auf ipfs://{dirCid}/<id>.json verweist
  • Das Verzeichnis anderswo pinnen — jedes IPFS-Gateway weltweit kann einen UnixFS-Verzeichnis-CID auflösen

Snapshots sind inhaltsadressiert: identischer Ordnerinhalt erzeugt immer denselben CID. Ein erneutes Snapshotten eines unveränderten Ordners liefert denselben CID wie zuvor. Das Hinzufügen/Entfernen/Umbenennen einer Datei erzeugt einen neuen CID; der vorherige CID bleibt gepinnt und auflösbar, solange Sie seine Dateien nicht löschen.

Ordner erstellen ​

POST /folders

ParameterTypErforderlichBeschreibung
namestringJaAnzeigename.
parentFolderIdstring | nullNeinID des übergeordneten Ordners für verschachtelte Ordner. Weglassen für einen Ordner auf oberster Ebene.

Beispiel ​

bash
curl -X POST https://api.ipfs.ninja/folders \
  -H "X-Api-Key: bws_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "name": "My NFT collection" }'

Antwort:

json
{
  "folderId": "1f8e2c3a-…",
  "name": "My NFT collection",
  "parentFolderId": null,
  "createdAt": 1746360000000
}

Neu erstellte Ordner haben noch keinen Snapshot. Das Feld latestSnapshot erscheint auf dem Ordner, sobald Sie POST /folders/{id}/snapshot aufrufen (siehe unten), und in nachfolgenden GET /folders-Antworten.

Ordner auflisten ​

GET /folders

Gibt jeden Ordner in Ihrem Konto zurück, sowohl auf oberster Ebene als auch verschachtelt, mit dem letzten Snapshot-CID für jeden (falls vorhanden).

json
[
  {
    "folderId": "1f8e2c3a-…",
    "name": "My NFT collection",
    "parentFolderId": null,
    "createdAt": 1746360000000,
    "fileCount": 42,
    "latestSnapshot": {
      "cid": "QmRZx5…",
      "takenAt": 1746421000000,
      "fileCount": 42
    }
  }
]

fileCount spiegelt den aktuellen Inhalt des Ordners wider; latestSnapshot.fileCount spiegelt den Inhalt zum Zeitpunkt des letzten Snapshots wider. Wenn sie voneinander abweichen, löst der Snapshot-CID zwar weiterhin auf, ist aber veraltet — snapshotten Sie erneut, um zu aktualisieren.

Datei in einen Ordner verschieben ​

PUT /files/{cid}/move

ParameterTypErforderlichBeschreibung
folderIdstring | nullJaZiel-Ordner-ID, oder null, um die Datei in das Stammverzeichnis zu verschieben.
bash
curl -X PUT https://api.ipfs.ninja/files/Qm.../move \
  -H "X-Api-Key: bws_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "folderId": "1f8e2c3a-…" }'

Ordner snapshotten (einen UnixFS-Verzeichnis-CID erhalten) ​

POST /folders/{folderId}/snapshot

Materialisiert den Ordner als echtes UnixFS-Verzeichnis auf dem IPFS-Cluster und pinnt das Ergebnis. Gibt einen CID für den gesamten Ordner zurück. Die Namen der Kindelemente stammen aus dem fileName jeder Datei; Duplikate werden automatisch aufgelöst.

Es ist kein Anfragekörper erforderlich; der Pfadparameter identifiziert den Ordner.

Beispiel ​

bash
curl -X POST https://api.ipfs.ninja/folders/1f8e2c3a-.../snapshot \
  -H "X-Api-Key: bws_your_api_key_here"

Antwort:

json
{
  "ok": true,
  "folderId": "1f8e2c3a-…",
  "cid": "QmRZx5VgFHDsG7ECvaKkZBS4ydmkdAkDyaKyF71RYvh8",
  "fileCount": 42,
  "sizeBytes": 8421376,
  "takenAt": 1746421000000,
  "ipfsUrl": "https://ipfs.ninja/ipfs/QmRZx5.../"
}

Der CID wird zudem in der Ordnerzeile gespeichert, sodass nachfolgende GET /folders-Aufrufe ihn als latestSnapshot.cid zurückgeben, ohne einen weiteren Snapshot zu benötigen.

Einen Snapshot auflösen ​

Sobald ein Snapshot gepinnt ist, löst der Verzeichnis-CID über jedes IPFS-Gateway auf. Das einfachste URL-Muster:

https://ipfs.ninja/ipfs/{dirCid}/         → Verzeichnisauflistung
https://ipfs.ninja/ipfs/{dirCid}/photo.jpg → genau diese Datei

Der Cluster pinnt rekursiv, sodass Kindelemente ebenfalls auflösbar sind — selbst wenn Sie später die ursprüngliche Datei aus Ihrem Konto löschen, überlebt die Kopie des Snapshots, weil sie ein separater Pin ist, der durch das Verzeichnis rekursiert.

Erneutes Snapshotten ​

Ein erneutes Snapshotten eines unveränderten Ordners gibt denselben CID zurück — Verzeichnis-CIDs sind inhaltsadressiert, sodass identischer Inhalt immer denselben Hash erzeugt, und der Pin-Aufruf des Clusters erkennt das Duplikat und ist auf seiner Seite ein No-op.

Hinweis: Der Snapshot-Vorgang selbst ist nicht kostenlos, auch wenn das Ergebnis derselbe CID ist. Jeder Aufruf liest die Bytes jeder Datei erneut von IPFS und lädt sie als Multipart an den /add-Endpunkt des Clusters hoch — dort findet das Einwickeln in ein Verzeichnis statt. Bei typischen Ordnern (≤100 kleine Dateien) ist dies weiterhin in wenigen Sekunden abgeschlossen; bei sehr großen Ordnern sollten Sie den Snapshot nur dann aufrufen, wenn sich der Inhalt tatsächlich geändert hat.

Ein Snapshot-Aufruf, nachdem Sie Dateien hinzugefügt oder entfernt haben, erzeugt einen anderen CID; der vorherige löst weiterhin auf, solange Sie die zugrunde liegenden Dateien nicht löschen.

Limits ​

  • Der Ordner muss mindestens eine Datei enthalten. Leere Ordner geben 400 — folder is empty zurück.
  • Zeichen in Dateinamen werden im Multipart-Upload, den Kubo entgegennimmt, URL-kodiert; Gateway-URLs benötigen für Leerzeichen oder Nicht-ASCII-Zeichen in Ihren Dateinamen unter Umständen eine Prozent-Kodierung.
  • Snapshots zählen genau einmal pro eindeutigem CID zum Pin-Gesamtwert Ihres Plans — Dateiblöcke werden dedupliziert, sodass der Snapshot größtenteils nur einen winzigen Verzeichnisknoten zu Dateien hinzufügt, die Sie bereits pinnen.

Ordner aktualisieren ​

PUT /folders/{folderId}

ParameterTypErforderlichBeschreibung
namestringNeinNeuer Anzeigename.
parentFolderIdstring | nullNeinOrdner neu zuordnen. null verschiebt ihn in das Stammverzeichnis.

Ordner löschen ​

DELETE /folders/{folderId}

Löscht den Ordner und kaskadiert rekursiv durch jede darin enthaltene Datei und jeden Unterordner. Unterliegt derselben Shared-CID-Sicherheitsprüfung wie einzelne Datei-Löschungen — wenn andere Benutzer einen von Ihnen hochgeladenen CID weiterhin pinnen, entfernt Ihr Unpin ihn für sie nicht.

json
{
  "deleted": true,
  "filesDeleted": 42,
  "foldersDeleted": 3
}

S3-CORS für einen Ordner / Bucket konfigurieren ​

Ordner, die über die S3-kompatible API freigegeben werden, fungieren als Buckets. Wenn Sie diese API aus Browser-JavaScript heraus ansteuern, benötigen Sie CORS-Regeln für den Bucket, damit Browser-Preflights durchgehen. Zwei gleichwertige Oberflächen schreiben in denselben Speicher:

  • PUT /folders/{folderId}/cors — dieser REST-Endpunkt, JWT-authentifiziert (vom Dashboard verwendet)
  • S3-Subresource PUT /{bucket}?cors — SigV4-authentifiziert (von AWS SDKs verwendet, siehe s3-compatibility.md)

Das PUT auf diesen Endpunkt beansprucht zudem den Namen des Ordners als global eindeutigen Bucket-Namen, sofern dieser noch nicht beansprucht wurde.

PUT /folders/{folderId}/cors ​

Legt die CORS-Regeln für den S3-Bucket des Ordners fest. Bis zu 5 Regeln pro Bucket, insgesamt 64 KB.

ParameterTypErforderlichBeschreibung
rulesCorsRule[]JaArray von AWS-förmigen CORS-Regeln (siehe unten). Nicht leer.
bucketNamestringNeinExpliziter S3-Bucket-Name. Standardmäßig der Anzeigename des Ordners. Falls der gewünschte Name bereits global beansprucht ist, übergeben Sie hier eine Alternative.

Jede CorsRule:

FeldTypErforderlichBeschreibung
AllowedOriginsstring[]JaOrigins, die Anfragen senden dürfen. Unterstützt Wildcards (https://*.myapp.com). Verwenden Sie * für jeden Origin.
AllowedMethodsstring[]JaEine oder mehrere von GET, HEAD, PUT, POST, DELETE.
AllowedHeadersstring[]NeinHeader, die Browser bei Anfragen einbeziehen dürfen. Standard: keine. Verwenden Sie ["*"], um alle zuzulassen (empfohlen für AWS SDK v3, das Authorization, x-amz-* usw. sendet).
ExposeHeadersstring[]NeinAntwort-Header, die für Browser-JavaScript lesbar gemacht werden. Fügen Sie ETag und x-amz-meta-cid hinzu, falls Ihre App den zurückgegebenen CID benötigt.
MaxAgeSecondsnumberNeinWie lange Browser das Preflight zwischenspeichern. 0-86400. Standard 3600.
IDstringNeinFreitext-Bezeichnung für die Regel.

Beispielanfrage ​

bash
curl -X PUT https://api.ipfs.ninja/folders/17f6dfd8-519c-4d0e-8f3a-5988a1d34ef2/cors \
  -H "Authorization: Bearer $COGNITO_JWT" \
  -H "Content-Type: application/json" \
  -d '{
    "rules": [{
      "AllowedOrigins": ["https://myapp.com", "http://localhost:3000"],
      "AllowedMethods": ["GET", "HEAD", "PUT", "POST", "DELETE"],
      "AllowedHeaders": ["*"],
      "ExposeHeaders": ["ETag", "x-amz-meta-cid", "x-amz-request-id"],
      "MaxAgeSeconds": 3600
    }]
  }'

Antwort 200 OK ​

json
{ "success": true, "rules": [ { "AllowedOrigins": ["https://myapp.com", "http://localhost:3000"], "AllowedMethods": ["GET", "HEAD", "PUT", "POST", "DELETE"], "AllowedHeaders": ["*"], "ExposeHeaders": ["ETag", "x-amz-meta-cid", "x-amz-request-id"], "MaxAgeSeconds": 3600 } ] }

GET /folders/{folderId}/cors ​

Gibt die aktuellen CORS-Regeln sowie den Bucket-Namen zurück (falls beansprucht).

json
{
  "rules": [ … ],
  "bucketName": "my-project"
}

DELETE /folders/{folderId}/cors ​

Entfernt alle CORS-Regeln. Browser-Preflights gegen den Bucket schlagen fehl (fail closed), bis neue Regeln festgelegt werden.

Alternative über das Dashboard

Auf der Dateien-Seite hat das Aktionsmenü jedes Ordners einen S3 CORS-Eintrag, der einen formularbasierten Editor öffnet. Gleicher zugrunde liegender Speicher wie dieser REST-Endpunkt und wie PutBucketCors über die S3 API.