Skip to content

Mapper

Mapper organiserer dine uploadede filer i dashboardet. De er kun metadata som standard — filer beholder deres egne CID'er og flyttes ikke på IPFS — men du kan også tage et snapshot af en mappe for at materialisere den som en rigtig UnixFS-mappe og få ét CID for det hele.

Hvornår du skal snapshotte en mappe

Et mappe-snapshot er ét IPFS-mappe-CID, der indeholder hver fil i mappen, adresserbar efter navn. Med det kan du:

  • Dele hele mappen via én URL: https://ipfs.ninja/ipfs/{dirCid}/
  • Opløse https://ipfs.ninja/ipfs/{dirCid}/photo.jpg (eller enhver anden gateway) direkte
  • Sætte CID'et ind i en ENS-contenthash for at hoste et statisk websted
  • Bruge det som base-CID for en NFT-samling, så hver token refererer til ipfs://{dirCid}/<id>.json
  • Fastgøre mappen andre steder — enhver IPFS-gateway i verden ved, hvordan man opløser et UnixFS-mappe-CID

Snapshots er indholdsadresserede: identisk mappeindhold producerer altid det samme CID. Gentag et snapshot af en mappe, du ikke har ændret, og du får det samme CID, som du fik før. Tilføjelse/fjernelse/omdøbning af en fil producerer et nyt CID; det forrige CID forbliver fastgjort og opløseligt, så længe du ikke sletter dets filer.

Opret mappe

POST /folders

ParameterTypePåkrævetBeskrivelse
namestringJaVisningsnavn.
parentFolderIdstring | nullNejOverordnet mappe-ID for indlejrede mapper. Udelad for en rodmappe.

Eksempel

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" }'

Returnerer:

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

Nyoprettede mapper har intet snapshot. Feltet latestSnapshot vises på mappen, når du kalder POST /folders/{id}/snapshot (se nedenfor), og på efterfølgende GET /folders-svar.

List mapper

GET /folders

Returnerer alle mapper i din konto, både på rodniveau og indlejrede, med det seneste snapshot-CID for hver (hvis nogen).

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

fileCount afspejler mappens nuværende indhold; latestSnapshot.fileCount afspejler indholdet på tidspunktet for det seneste snapshot. Hvis de afviger, opløses snapshot-CID'et stadig, men er forældet — tag et nyt snapshot for at opdatere det.

Flyt en fil til en mappe

PUT /files/{cid}/move

ParameterTypePåkrævetBeskrivelse
folderIdstring | nullJaMål-mappe-ID, eller null for at flytte filen til roden.
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-…" }'

Tag et snapshot af en mappe (få et UnixFS-mappe-CID)

POST /folders/{folderId}/snapshot

Materialiser mappen som en rigtig UnixFS-mappe på IPFS-klyngen og fastgør resultatet. Returnerer ét CID for hele mappen. Navne på underliggende elementer kommer fra hver fils fileName; dubletter afkollideres automatisk.

Ingen forespørgselskrop er nødvendig; stiparameteren identificerer mappen.

Eksempel

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

Returnerer:

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

CID'et gemmes også på mapperækken, så efterfølgende GET /folders-kald returnerer det som latestSnapshot.cid uden behov for endnu et snapshot.

Opløsning af et snapshot

Når et snapshot er fastgjort, opløses mappe-CID'et via enhver IPFS-gateway. Det simpleste URL-mønster:

https://ipfs.ninja/ipfs/{dirCid}/         → mappevisning
https://ipfs.ninja/ipfs/{dirCid}/photo.jpg → den ene fil

Klyngen fastgør rekursivt, så underliggende elementer også kan opløses — selv hvis du senere sletter den oprindelige fil fra din konto, overlever snapshottets kopi, fordi det er en separat fastgørelse, der rekurserer gennem mappen.

Gentagelse af snapshot

Gentagelse af et snapshot af en uændret mappe returnerer det samme CID — mappe-CID'er er indholdsadresserede, så identisk indhold producerer altid den samme hash, og klyngens fastgørelseskald genkender dubletten og er en no-op i den ende.

Bemærk: selve snapshot-stien er ikke gratis, selvom resultatet er det samme CID. Hvert kald læser hver fils bytes tilbage fra IPFS og genuploader dem som en multipart til klyngens /add-endpoint — det er der, indpakning-med-mappe sker. For typiske mapper (≤100 små filer) er dette stadig færdigt på et par sekunder; for meget store mapper er det bedst kun at kalde snapshot, når indholdet faktisk er ændret.

Kald af snapshot, efter du har tilføjet eller fjernet filer, producerer et andet CID; det forrige fortsætter med at kunne opløses, så længe du ikke sletter dets underliggende filer.

Begrænsninger

  • Mappen skal indeholde mindst én fil. Tomme mapper returnerer 400 — folder is empty.
  • Filnavne-tegn URL-kodes i den multipart-upload, Kubo accepterer; gateway-URL'er kan kræve procent-kodning for mellemrum eller ikke-ASCII-tegn i dine filnavne.
  • Snapshots tæller mod dit plans samlede antal fastgørelser præcis én gang per unikt CID — filblokke deduplikeres, så snapshottet mest tilføjer en lille mappe-node oven på filer, du allerede fastgør.

Opdater en mappe

PUT /folders/{folderId}

ParameterTypePåkrævetBeskrivelse
namestringNejNyt visningsnavn.
parentFolderIdstring | nullNejFlyt mappen til en ny overordnet mappe. null flytter den til roden.

Slet en mappe

DELETE /folders/{folderId}

Sletter mappen og kaskaderer rekursivt gennem hver fil og undermappe, den indeholder. Underlagt den samme delte-CID-sikkerhedskontrol som individuelle filsletninger — hvis andre brugere stadig fastgør et CID, du uploadede, fjerner din afgørelse ikke fastgørelsen for dem.

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

Konfigurer S3 CORS for en mappe/bucket

Mapper eksponeret via det S3-kompatible API fungerer som buckets. Hvis du styrer det API fra browser-JavaScript, skal du have CORS-regler på bucket'en, så browser-preflights går igennem. To ækvivalente flader gemmer til det samme lager:

  • PUT /folders/{folderId}/cors — dette REST-endpoint, JWT-godkendt (bruges af dashboardet)
  • S3-underressourcen PUT /{bucket}?cors — SigV4-godkendt (bruges af AWS SDK'er, se s3-compatibility.md)

PUT'et på dette endpoint kræver også mappens navn som en globalt unik bucket, hvis det ikke allerede er krævet.

PUT /folders/{folderId}/cors

Angiv CORS-reglerne for mappens S3-bucket. Op til 5 regler per bucket, 64 KB i alt.

ParameterTypePåkrævetBeskrivelse
rulesCorsRule[]JaArray af AWS-formede CORS-regler (se nedenfor). Må ikke være tom.
bucketNamestringNejEksplicit S3-bucket-navn. Standard er mappens visningsnavn. Hvis det ønskede navn allerede er krævet globalt, angiv et alternativ her.

Hver CorsRule:

FeltTypePåkrævetBeskrivelse
AllowedOriginsstring[]JaOprindelser, der må sende forespørgsler. Understøtter jokertegn (https://*.myapp.com). Brug * for enhver oprindelse.
AllowedMethodsstring[]JaEn eller flere af GET, HEAD, PUT, POST, DELETE.
AllowedHeadersstring[]NejHeadere, browsere må inkludere på forespørgsler. Standard: ingen. Brug ["*"] for at tillade alle (anbefales til AWS SDK v3, som sender Authorization, x-amz-* osv.).
ExposeHeadersstring[]NejSvar-headere gjort læsbare for browser-JavaScript. Inkluder ETag og x-amz-meta-cid, hvis din app har brug for det returnerede CID.
MaxAgeSecondsnumberNejHvor længe browsere cacher preflighten. 0-86400. Standard 3600.
IDstringNejFritekst-label til reglen.

Eksempelforespørgsel

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
    }]
  }'

Svar 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

Returnerer de nuværende CORS-regler plus bucket-navnet (hvis krævet).

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

DELETE /folders/{folderId}/cors

Fjerner alle CORS-regler. Browser-preflights mod bucket'en vil fejle lukket, indtil nye regler sættes.

Alternativ via dashboard

På Filer-siden har hver mappes handlingsmenu en S3 CORS-post, der åbner en formularbaseret editor. Samme underliggende lager som dette REST-endpoint og som PutBucketCors via S3 API.