Skip to content

Mape

Mape organizirajo vaše naložene datoteke v nadzorni plošči. Privzeto vsebujejo samo metapodatke — datoteke ohranijo lastne CID-je in niso premaknjene na IPFS-u — vendar lahko posnamete mapo in jo materializirate kot pravi UnixFS imenik ter dobite en CID za celoten sklop.

Kdaj bi posneli mapo

Posnetek mape je en sam CID IPFS imenika, ki vsebuje vse datoteke v mapi, naslovljive po imenu. Z njim lahko:

  • Delite celotno mapo prek enega URL-ja: https://ipfs.ninja/ipfs/{dirCid}/
  • Neposredno razrešite https://ipfs.ninja/ipfs/{dirCid}/photo.jpg (ali prek katerega koli drugega prehoda)
  • Vstavite CID v ENS contenthash za gostovanje statične spletne strani
  • Uporabite ga kot osnovni CID zbirke NFT, tako da vsak žeton kaže na ipfs://{dirCid}/<id>.json
  • Pripnete imenik kjer koli drugje — vsak IPFS prehod na svetu zna razrešiti CID UnixFS imenika

Posnetki so naslovljeni po vsebini: enaka vsebina mape vedno proizvede isti CID. Ponovno snemanje mape, ki je niste spreminjali, vrne isti CID kot prej. Dodajanje/odstranjevanje/preimenovanje datoteke ustvari nov CID; prejšnji CID ostane pripet in razrešljiv, dokler ne izbrišete njegovih datotek.

Ustvarjanje mape

POST /folders

ParameterTipObveznoOpis
namestringDaPrikazno ime.
parentFolderIdstring | nullNeID nadrejene mape za gnezdene mape. Izpustite za mapo na korenski ravni.

Primer

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

Vrne:

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

Novo ustvarjene mape nimajo posnetka. Polje latestSnapshot se pojavi na mapi, ko pokličete POST /folders/{id}/snapshot (glejte spodaj), in v poznejših odgovorih GET /folders.

Seznam map

GET /folders

Vrne vsako mapo v vašem računu, na korenski ravni in gnezdeno, s CID-jem zadnjega posnetka za vsako (če obstaja).

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

fileCount odraža trenutno vsebino mape; latestSnapshot.fileCount odraža vsebino v času zadnjega posnetka. Če se razlikujeta, se CID posnetka še vedno razreši, vendar je zastarel — ponovno posnemite za osvežitev.

Premikanje datoteke v mapo

PUT /files/{cid}/move

ParameterTipObveznoOpis
folderIdstring | nullDaID ciljne mape ali null za premik datoteke v koren.
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-…" }'

Snemanje mape (pridobitev CID UnixFS imenika)

POST /folders/{folderId}/snapshot

Materializira mapo kot pravi UnixFS imenik na IPFS grozdu in rezultat pripne. Vrne en CID za celotno mapo. Imena otrok izhajajo iz fileName vsake datoteke; dvojniki se samodejno razrešijo brez trkov.

Telo zahteve ni potrebno; parameter poti identificira mapo.

Primer

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

Vrne:

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

CID se prav tako shrani na vrstici mape, tako da ga poznejši klici GET /folders vrnejo kot latestSnapshot.cid, ne da bi bilo potrebno novo snemanje.

Razreševanje posnetka

Ko je posnetek pripet, se CID imenika razreši prek katerega koli IPFS prehoda. Najpreprostejši vzorec URL-ja:

https://ipfs.ninja/ipfs/{dirCid}/         → seznam imenika
https://ipfs.ninja/ipfs/{dirCid}/photo.jpg → ta ena datoteka

Grozd pripenja rekurzivno, tako da so tudi otroci razrešljivi — tudi če pozneje izbrišete izvirno datoteko iz svojega računa, kopija v posnetku preživi, ker je ločeno pripenjanje, ki rekurzivno prehaja skozi imenik.

Ponovno snemanje

Ponovno snemanje nespremenjene mape vrne isti CID — CID-ji imenikov so naslovljeni po vsebini, tako da enaka vsebina vedno proizvede isto zgoščeno vrednost, in klic pripenjanja v grozdu prepozna dvojnik ter je na njegovi strani prazna operacija.

Opomba: pot snemanja sama po sebi ni brezplačna, tudi ko je rezultat isti CID. Vsak klic prebere bajte vsake datoteke nazaj iz IPFS-a in jih ponovno naloži kot večdelno vsebino na končno točko /add grozda — tam se izvede ovijanje z imenikom (wrap-with-directory). Za tipične mape (≤100 majhnih datotek) se to še vedno zaključi v nekaj sekundah; za zelo velike mape raje pokličite snemanje samo, ko se vsebina dejansko spremeni.

Klic snemanja po dodajanju ali odstranjevanju datotek proizvede drugačen CID; prejšnji se še naprej razreši, dokler ne izbrišete njegovih temeljnih datotek.

Omejitve

  • Mapa mora vsebovati vsaj eno datoteko. Prazne mape vrnejo 400 — folder is empty.
  • Znaki v imenih datotek so URL-kodirani v večdelnem nalaganju, ki ga sprejema Kubo; URL-ji prehoda lahko potrebujejo procentno kodiranje za presledke ali znake, ki niso ASCII, v vaših imenih datotek.
  • Posnetki se štejejo v skupno število pripenjanj vašega načrta natanko enkrat na edinstven CID — bloki datotek so deduplicirani, tako da posnetek večinoma doda le majhno vozlišče imenika povrh datotek, ki jih že pripenjate.

Posodobitev mape

PUT /folders/{folderId}

ParameterTipObveznoOpis
namestringNeNovo prikazno ime.
parentFolderIdstring | nullNePonovno določi nadrejeno mapo. null jo premakne v koren.

Brisanje mape

DELETE /folders/{folderId}

Izbriše mapo in rekurzivno kaskadno izbriše vsako datoteko in podmapo, ki jo vsebuje. Za brisanje velja enak varnostni ukrep za deljene CID-je kot pri posameznih brisanjih datotek — če drugi uporabniki še vedno pripenjajo CID, ki ste ga naložili, vaš odpin ne odstrani vsebine zanje.

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

Konfiguracija S3 CORS za mapo / vedro

Mape, izpostavljene prek S3-združljivega API-ja, delujejo kot vedra. Če ta API poganjate iz brskalniškega JavaScripta, potrebujete CORS pravila na vedru, da prehodne preverbe (preflight) v brskalniku uspejo. Dva enakovredna vmesnika shranjujeta v isto zbirko:

  • PUT /folders/{folderId}/cors — ta REST končna točka, avtenticirana z JWT (uporablja jo nadzorna plošča)
  • S3 podvir PUT /{bucket}?cors — avtenticiran s SigV4 (uporabljajo ga AWS SDK-ji, glejte s3-compatibility.md)

PUT na tej končni točki tudi zahteva ime mape kot globalno edinstveno ime vedra, če to še ni zahtevano.

PUT /folders/{folderId}/cors

Nastavi CORS pravila za S3 vedro mape. Do 5 pravil na vedro, skupaj 64 KB.

ParameterTipObveznoOpis
rulesCorsRule[]DaPolje CORS pravil v obliki AWS (glejte spodaj). Ne sme biti prazno.
bucketNamestringNeEksplicitno ime S3 vedra. Privzeto je prikazno ime mape. Če je želeno ime že globalno zasedeno, tukaj podajte alternativo.

Vsako CorsRule:

PoljeTipObveznoOpis
AllowedOriginsstring[]DaIzvori, ki lahko pošiljajo zahteve. Podpira nadomestne znake (https://*.myapp.com). Uporabite * za kateri koli izvor.
AllowedMethodsstring[]DaEden ali več od GET, HEAD, PUT, POST, DELETE.
AllowedHeadersstring[]NeGlave, ki jih brskalniki lahko vključijo v zahteve. Privzeto: nobene. Uporabite ["*"], da dovolite vse (priporočeno za AWS SDK v3, ki pošilja Authorization, x-amz-* itd.).
ExposeHeadersstring[]NeGlave odgovora, ki so berljive brskalniškemu JavaScriptu. Vključite ETag in x-amz-meta-cid, če vaša aplikacija potrebuje vrnjeni CID.
MaxAgeSecondsnumberNeKako dolgo brskalniki predpomnijo prehodno preverbo. 0-86400. Privzeto 3600.
IDstringNeProstotekstna oznaka za pravilo.

Primer zahteve

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

Odgovor 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

Vrne trenutna CORS pravila in ime vedra (če je zahtevano).

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

DELETE /folders/{folderId}/cors

Odstrani vsa CORS pravila. Prehodne preverbe brskalnika proti vedru bodo zaprte, dokler niso nastavljena nova pravila.

Alternativa v nadzorni plošči

Na strani Datoteke ima meni dejanj vsake mape vnos S3 CORS, ki odpre urejevalnik v obliki obrazca. Ista temeljna zbirka kot ta REST končna točka in kot PutBucketCors prek S3 API-ja.