Skip to content

Папки ​

Папки організовують ваші завантажені файли в dashboard. За замовчуванням вони існують лише як метадані — файли зберігають власні CID і не переміщуються в IPFS — але ви також можете зробити знімок папки (snapshot), щоб матеріалізувати її як справжню директорію UnixFS та отримати один CID для всього вмісту.

Коли варто робити знімок папки ​

Знімок папки — це один directory CID в IPFS, що містить кожен файл папки, адресований за іменем. З ним ви можете:

  • Поділитися всією папкою через одне посилання: https://ipfs.ninja/ipfs/{dirCid}/
  • Розв'язати https://ipfs.ninja/ipfs/{dirCid}/photo.jpg (або будь-який інший gateway) напряму
  • Помістити CID у ENS contenthash для хостингу статичного сайту
  • Використати його як базовий CID колекції NFT, щоб кожен токен посилався на ipfs://{dirCid}/<id>.json
  • Закріпити директорію будь-де ще — кожен gateway IPFS у світі знає, як розв'язати directory CID UnixFS

Знімки є адресованими за вмістом: ідентичний вміст папки завжди дає той самий CID. Повторний знімок папки, яку ви не змінювали, повертає той самий CID, що й раніше. Додавання/видалення/перейменування файлу створює новий CID; попередній CID залишається закріпленим і розв'язуваним, доки ви не видалите його файли.

Створити папку ​

POST /folders

ПараметрТипОбов'язковийОпис
namestringТакВідображувана назва.
parentFolderIdstring | nullНіID батьківської папки для вкладених папок. Пропустіть для папки кореневого рівня.

Приклад ​

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

Повертає:

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

Щойно створені папки не мають знімка. Поле latestSnapshot з'являється на папці після виклику POST /folders/{id}/snapshot (див. нижче) і в наступних відповідях GET /folders.

Список папок ​

GET /folders

Повертає кожну папку вашого облікового запису, кореневого рівня та вкладені, з CID останнього знімка для кожної (якщо є).

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

fileCount відображає поточний вміст папки; latestSnapshot.fileCount відображає вміст на момент останнього знімка. Якщо вони відрізняються, CID знімка все ще розв'язується, але є застарілим — зробіть новий знімок, щоб оновити.

Перемістити файл у папку ​

PUT /files/{cid}/move

ПараметрТипОбов'язковийОпис
folderIdstring | nullТакID цільової папки, або null, щоб перемістити файл у корінь.
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-…" }'

Зробити знімок папки (отримати directory CID UnixFS) ​

POST /folders/{folderId}/snapshot

Матеріалізує папку як справжню директорію UnixFS у кластері IPFS та закріплює результат. Повертає один CID для всієї папки. Назви дочірніх елементів беруться з поля fileName кожного файлу; дублікати автоматично усуваються.

Тіло запиту не потрібне; папку ідентифікує параметр шляху.

Приклад ​

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

Повертає:

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

CID також зберігається в записі папки, тому наступні виклики GET /folders повертають його як latestSnapshot.cid без потреби робити ще один знімок.

Розв'язання знімка ​

Щойно знімок закріплений, directory CID розв'язується через будь-який gateway IPFS. Найпростіший шаблон URL:

https://ipfs.ninja/ipfs/{dirCid}/         → лістинг директорії
https://ipfs.ninja/ipfs/{dirCid}/photo.jpg → цей конкретний файл

Кластер закріплює рекурсивно, тому дочірні елементи теж розв'язуються — навіть якщо ви пізніше видалите оригінальний файл зі свого облікового запису, копія знімка виживає, оскільки це окремий пінінг, що рекурсивно проходить через директорію.

Повторний знімок ​

Повторний знімок незміненої папки повертає той самий CID — directory CID адресуються за вмістом, тому ідентичний вміст завжди дає той самий хеш, і виклик пінінгу кластера розпізнає дублікат і не виконує жодних дій на своєму боці.

Примітка: сам шлях знімка не є безкоштовним, навіть коли результат — той самий CID. Кожен виклик зчитує байти кожного файлу назад з IPFS і повторно завантажує їх як multipart на ендпоінт /add кластера — саме там відбувається обгортання директорією. Для типових папок (≤100 малих файлів) це все ще завершується за кілька секунд; для дуже великих папок надавайте перевагу виклику знімка лише тоді, коли вміст дійсно змінився.

Виклик знімка після додавання або видалення файлів створює інший CID; попередній продовжує розв'язуватися, доки ви не видалите його базові файли.

Ліміти ​

  • Папка повинна містити хоча б один файл. Порожні папки повертають 400 — folder is empty.
  • Символи імені файлу URL-кодуються в multipart-завантаженні, яке приймає Kubo; URL gateway можуть потребувати відсоткового кодування для пробілів або не-ASCII символів у назвах ваших файлів.
  • Знімки враховуються у загальну кількість пінінгів вашого плану рівно один раз на унікальний CID — блоки файлів дедуплікуються, тому знімок здебільшого додає лише невеликий вузол директорії поверх файлів, які ви вже закріпили.

Оновити папку ​

PUT /folders/{folderId}

ПараметрТипОбов'язковийОпис
namestringНіНова відображувана назва.
parentFolderIdstring | nullНіЗмінити батьківську папку. null переміщує її в корінь.

Видалити папку ​

DELETE /folders/{folderId}

Видаляє папку та рекурсивно каскадує через кожен файл і підпапку, які вона містить. Підлягає тому самому захисту спільного CID, що й видалення окремих файлів — якщо інші користувачі все ще закріплюють CID, який ви завантажили, ваше відкріплення не видаляє його для них.

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

Налаштування S3 CORS для папки / bucket'а ​

Папки, доступні через S3-сумісний API, виступають як bucket'и. Якщо ви керуєте цим API з браузерного JavaScript, вам потрібні правила CORS на bucket'і, щоб браузерні preflight-запити проходили успішно. Дві еквівалентні поверхні зберігають дані в одному й тому самому сховищі:

  • PUT /folders/{folderId}/cors — цей REST-ендпоінт, автентифікований через JWT (використовується dashboard)
  • Субресурс S3 PUT /{bucket}?cors — автентифікований через SigV4 (використовується AWS SDK, див. s3-compatibility.md)

PUT на цьому ендпоінті також закріплює назву папки як глобально унікальний bucket, якщо вона ще не була закріплена.

PUT /folders/{folderId}/cors ​

Встановлює правила CORS для S3-bucket'а папки. До 5 правил на bucket, загалом 64 КБ.

ПараметрТипОбов'язковийОпис
rulesCorsRule[]ТакМасив правил CORS у форматі AWS (див. нижче). Не порожній.
bucketNamestringНіЯвна назва S3-bucket'а. За замовчуванням — відображувана назва папки. Якщо бажана назва вже зайнята глобально, передайте тут альтернативу.

Кожне CorsRule:

ПолеТипОбов'язковийОпис
AllowedOriginsstring[]ТакДжерела, яким дозволено надсилати запити. Підтримує wildcard-и (https://*.myapp.com). Використовуйте * для будь-якого джерела.
AllowedMethodsstring[]ТакОдин або кілька з GET, HEAD, PUT, POST, DELETE.
AllowedHeadersstring[]НіЗаголовки, які браузери можуть включати в запити. За замовчуванням: жодного. Використовуйте ["*"], щоб дозволити всі (рекомендовано для AWS SDK v3, який надсилає Authorization, x-amz-* тощо).
ExposeHeadersstring[]НіЗаголовки відповіді, доступні для читання браузерному JavaScript. Додайте ETag та x-amz-meta-cid, якщо вашому додатку потрібен повернутий CID.
MaxAgeSecondsnumberНіЯк довго браузери кешують preflight-запит. 0-86400. За замовчуванням 3600.
IDstringНіДовільна текстова мітка для правила.

Приклад запиту ​

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

Відповідь 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 ​

Повертає поточні правила CORS плюс назву bucket'а (якщо закріплена).

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

DELETE /folders/{folderId}/cors ​

Видаляє всі правила CORS. Браузерні preflight-запити до bucket'а будуть провалюватися, доки не будуть встановлені нові правила.

Альтернатива через dashboard

На сторінці Files у меню дій кожної папки є пункт S3 CORS, що відкриває редактор на основі форми. Те саме сховище під капотом, що й у цього REST-ендпоінту та у PutBucketCors через S3 API.