Skip to content

Carpetes

Les carpetes organitzen els vostres fitxers pujats al tauler de control. Per defecte només són metadata — els fitxers conserven els seus propis CID i no es mouen a IPFS — però també podeu fer un snapshot d'una carpeta per materialitzar-la com un directori UnixFS real i obtenir un sol CID per a tot el conjunt.

Quan fer un snapshot d'una carpeta

Un snapshot de carpeta és un únic CID de directori IPFS que conté tots els fitxers de la carpeta, adreçables pel seu nom. Amb ell podeu:

  • Compartir tota la carpeta amb una sola URL: https://ipfs.ninja/ipfs/{dirCid}/
  • Resoldre https://ipfs.ninja/ipfs/{dirCid}/photo.jpg (o qualsevol altre gateway) directament
  • Posar el CID en un contenthash d'ENS per allotjar un lloc web estàtic
  • Utilitzar-lo com a CID base d'una col·lecció NFT perquè cada token faci referència a ipfs://{dirCid}/<id>.json
  • Fixar el directori en qualsevol altre lloc — tots els gateways IPFS del món saben resoldre un CID de directori UnixFS

Els snapshots són adreçats per contingut: continguts de carpeta idèntics sempre produeixen el mateix CID. Tornar a fer un snapshot d'una carpeta que no heu modificat retorna el mateix CID que abans. Afegir/eliminar/canviar el nom d'un fitxer produeix un nou CID; el CID anterior es manté fixat i resoluble sempre que no elimineu els seus fitxers.

Crear carpeta

POST /folders

ParàmetreTipusRequeritDescripció
namestringNom a mostrar.
parentFolderIdstring | nullNoID de la carpeta pare per a carpetes imbricades. Ometeu-lo per a una carpeta d'arrel.

Exemple

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

Retorna:

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

Les carpetes acabades de crear no tenen snapshot. El camp latestSnapshot apareix a la carpeta un cop crideu POST /folders/{id}/snapshot (vegeu més avall) i en les respostes posteriors de GET /folders.

Llistar carpetes

GET /folders

Retorna totes les carpetes del vostre compte, tant les d'arrel com les imbricades, amb el CID del darrer snapshot per a cadascuna (si n'hi ha).

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

fileCount reflecteix el contingut actual de la carpeta; latestSnapshot.fileCount reflecteix el contingut en el moment del darrer snapshot. Si difereixen, el CID del snapshot encara es resol però està obsolet — torneu a fer un snapshot per actualitzar-lo.

Moure un fitxer a una carpeta

PUT /files/{cid}/move

ParàmetreTipusRequeritDescripció
folderIdstring | nullID de la carpeta de destinació, o null per moure el fitxer a l'arrel.
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-…" }'

Fer un snapshot d'una carpeta (obtenir un CID de directori UnixFS)

POST /folders/{folderId}/snapshot

Materialitza la carpeta com un directori UnixFS real al clúster IPFS i fixa el resultat. Retorna un sol CID per a tota la carpeta. Els noms dels fills provenen del fileName de cada fitxer; els duplicats es desambigüen automàticament.

No cal cap cos de sol·licitud; el paràmetre de ruta identifica la carpeta.

Exemple

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

Retorna:

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

El CID també es persisteix a la fila de la carpeta, així que les crides posteriors a GET /folders el retornen com a latestSnapshot.cid sense necessitat d'un altre snapshot.

Resoldre un snapshot

Un cop un snapshot està fixat, el CID de directori es resol a través de qualsevol gateway IPFS. El patró d'URL més senzill:

https://ipfs.ninja/ipfs/{dirCid}/         → directory listing
https://ipfs.ninja/ipfs/{dirCid}/photo.jpg → that one file

El clúster fixa recursivament, de manera que els fills també són resolubles — fins i tot si més tard elimineu el fitxer original del vostre compte, la còpia del snapshot sobreviu perquè és una fixació separada que recorre el directori.

Tornar a fer un snapshot

Tornar a fer un snapshot d'una carpeta sense canvis retorna el mateix CID — els CID de directori s'adrecen per contingut, així que continguts idèntics sempre produeixen el mateix hash, i la crida de fixació del clúster reconeix el duplicat i no fa res des de la seva banda.

Nota: el camí del snapshot en si no és gratuït encara que el resultat sigui el mateix CID. Cada crida llegeix els bytes de cada fitxer de tornada des d'IPFS i els torna a pujar com a multipart a l'endpoint /add del clúster — allà és on passa l'embolcallat amb el directori. Per a carpetes típiques (≤100 fitxers petits) això encara es completa en pocs segons; per a carpetes molt grans, és preferible cridar el snapshot només quan el contingut realment ha canviat.

Cridar el snapshot després d'afegir o eliminar fitxers produeix un CID diferent; l'anterior continua resolent-se sempre que no elimineu els seus fitxers subjacents.

Límits

  • La carpeta ha de contenir com a mínim un fitxer. Les carpetes buides retornen 400 — folder is empty.
  • Els caràcters del nom de fitxer es codifiquen com a URL a la pujada multipart que accepta Kubo; les URL del gateway poden necessitar codificació percentual per a espais o caràcters no ASCII als vostres noms de fitxer.
  • Els snapshots compten per al total de fixacions del vostre pla exactament un cop per CID únic — els blocs de fitxer es desduplicen, així que el snapshot majoritàriament afegeix un petit node de directori sobre fitxers que ja teniu fixats.

Actualitzar una carpeta

PUT /folders/{folderId}

ParàmetreTipusRequeritDescripció
namestringNoNou nom a mostrar.
parentFolderIdstring | nullNoCanvia la carpeta pare. null la mou a l'arrel.

Eliminar una carpeta

DELETE /folders/{folderId}

Elimina la carpeta i propaga recursivament a través de tots els fitxers i subcarpetes que conté. Subjecte a la mateixa protecció de seguretat de CID compartit que les eliminacions de fitxers individuals — si altres usuaris encara fixen un CID que vau pujar, el vostre desfixament no l'elimina per a ells.

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

Configurar S3 CORS per a una carpeta / bucket

Les carpetes exposades a través de l'API compatible amb S3 actuen com a buckets. Si crides aquesta API des de JavaScript al navegador, necessites regles CORS al bucket perquè els preflights del navegador passin. Dues superfícies equivalents persisteixen al mateix magatzem:

  • PUT /folders/{folderId}/cors — aquest endpoint REST, autenticat amb JWT (utilitzat pel tauler de control)
  • Subrecurs S3 PUT /{bucket}?cors — autenticat amb SigV4 (utilitzat pels AWS SDK, vegeu s3-compatibility.md)

El PUT en aquest endpoint també reclama el nom de la carpeta com a bucket únic globalment si encara no ha estat reclamat.

PUT /folders/{folderId}/cors

Estableix les regles CORS per al bucket S3 de la carpeta. Fins a 5 regles per bucket, 64 KB en total.

ParàmetreTipusRequeritDescripció
rulesCorsRule[]Matriu de regles CORS amb la forma d'AWS (vegeu més avall). No pot ser buida.
bucketNamestringNoNom explícit del bucket S3. Per defecte, el nom a mostrar de la carpeta. Si el nom desitjat ja està reclamat globalment, passeu-ne un altre aquí.

Cada CorsRule:

CampTipusRequeritDescripció
AllowedOriginsstring[]Orígens autoritzats a enviar sol·licituds. Admet comodins (https://*.myapp.com). Utilitzeu * per a qualsevol origen.
AllowedMethodsstring[]Un o més de GET, HEAD, PUT, POST, DELETE.
AllowedHeadersstring[]NoCapçaleres que els navegadors poden incloure a les sol·licituds. Per defecte: cap. Utilitzeu ["*"] per permetre-les totes (recomanat per a l'AWS SDK v3, que envia Authorization, x-amz-*, etc.).
ExposeHeadersstring[]NoCapçaleres de resposta que es fan llegibles per al JavaScript del navegador. Inclou ETag i x-amz-meta-cid si la teva aplicació necessita el CID retornat.
MaxAgeSecondsnumberNoQuant de temps el navegador guarda en memòria cau el preflight. 0-86400. Per defecte 3600.
IDstringNoEtiqueta de text lliure per a la regla.

Exemple de sol·licitud

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

Resposta 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

Retorna les regles CORS actuals més el nom del bucket (si ha estat reclamat).

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

DELETE /folders/{folderId}/cors

Elimina totes les regles CORS. Els preflights del navegador contra el bucket fallaran per defecte fins que s'estableixin noves regles.

Alternativa al tauler de control

A la pàgina de Fitxers, el menú d'accions de cada carpeta té una opció S3 CORS que obre un editor basat en formulari. Mateix magatzem subjacent que aquest endpoint REST i que PutBucketCors via l'API S3.