Skip to content

ফোল্ডার

ফোল্ডার ড্যাশবোর্ডে আপনার আপলোড করা ফাইলগুলি সংগঠিত করে। এগুলি ডিফল্টরূপে শুধুমাত্র metadata — ফাইল তাদের নিজস্ব CID ধরে রাখে এবং IPFS-এ সরানো হয় না — কিন্তু আপনি একটি ফোল্ডার স্ন্যাপশটও করতে পারেন যাতে এটি একটি প্রকৃত UnixFS ডিরেক্টরি হিসেবে বাস্তবায়িত হয় এবং পুরো জিনিসের জন্য একটি CID পান।

কখন একটি ফোল্ডার স্ন্যাপশট করবেন

একটি ফোল্ডার স্ন্যাপশট হলো একটি একক IPFS ডিরেক্টরি CID যা ফোল্ডারের প্রতিটি ফাইল ধারণ করে, নাম দ্বারা ঠিকানাযোগ্য। এটি দিয়ে আপনি পারবেন:

  • একটি URL দিয়ে সম্পূর্ণ ফোল্ডার শেয়ার করতে: https://ipfs.ninja/ipfs/{dirCid}/
  • https://ipfs.ninja/ipfs/{dirCid}/photo.jpg (বা অন্য যেকোনো গেটওয়ে) সরাসরি resolve করতে
  • একটি স্ট্যাটিক সাইট হোস্ট করতে CID-টি একটি ENS contenthash-এ রাখতে
  • একটি NFT কালেকশনের বেস CID হিসেবে এটি ব্যবহার করতে যাতে প্রতিটি টোকেন ipfs://{dirCid}/<id>.json রেফার করে
  • অন্য যেকোনো জায়গায় ডিরেক্টরিটি পিন করতে — বিশ্বের প্রতিটি IPFS গেটওয়ে জানে কীভাবে একটি UnixFS dir CID resolve করতে হয়

স্ন্যাপশট কন্টেন্ট-অ্যাড্রেসড: অভিন্ন ফোল্ডার কন্টেন্ট সবসময় একই CID তৈরি করে। আপনি পরিবর্তন করেননি এমন একটি ফোল্ডার পুনরায় স্ন্যাপশট করলে এটি আগে যে CID ফেরত দিয়েছিল সেটিই ফেরত দেয়। একটি ফাইল যোগ/সরানো/পুনঃনামকরণ একটি নতুন CID তৈরি করে; আগের CID পিন করা এবং resolve করার যোগ্য থাকে যতক্ষণ আপনি এর ফাইলগুলি মুছে না ফেলেন।

ফোল্ডার তৈরি করুন

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
}

নতুন-তৈরি ফোল্ডারের কোনো স্ন্যাপশট থাকে না। আপনি POST /folders/{id}/snapshot কল করার পর (নীচে দেখুন) এবং পরবর্তী GET /folders প্রতিক্রিয়ায় latestSnapshot ফিল্ডটি ফোল্ডারে দেখা যায়।

ফোল্ডারের তালিকা

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 তবুও resolve হয় কিন্তু stale — রিফ্রেশ করতে পুনরায় স্ন্যাপশট করুন।

একটি ফাইল ফোল্ডারে সরান

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

একটি ফোল্ডার স্ন্যাপশট করুন (একটি UnixFS dir CID পান)

POST /folders/{folderId}/snapshot

IPFS ক্লাস্টারে ফোল্ডারটিকে একটি প্রকৃত UnixFS ডিরেক্টরি হিসেবে বাস্তবায়িত করুন এবং ফলাফলটি পিন করুন। পুরো ফোল্ডারের জন্য একটি CID ফেরত দেয়। চাইল্ডের নামগুলি প্রতিটি ফাইলের fileName থেকে আসে; ডুপ্লিকেটগুলি স্বয়ংক্রিয়ভাবে de-collide করা হয়।

কোনো অনুরোধ বডির প্রয়োজন নেই; path প্যারামিটার ফোল্ডারটি চিহ্নিত করে।

উদাহরণ

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 হিসেবে ফেরত দেয়।

একটি স্ন্যাপশট resolve করা

একবার একটি স্ন্যাপশট পিন হয়ে গেলে, ডিরেক্টরি CID যেকোনো IPFS গেটওয়ের মাধ্যমে resolve হয়। সবচেয়ে সহজ URL প্যাটার্ন:

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

ক্লাস্টার recursively পিন করে, তাই চাইল্ডরাও resolve-যোগ্য থাকে — এমনকি আপনি পরে আপনার অ্যাকাউন্ট থেকে মূল ফাইলটি মুছে ফেললেও, স্ন্যাপশটের কপি টিকে থাকে কারণ এটি ডিরেক্টরির মধ্য দিয়ে recurse করা একটি পৃথক পিন।

পুনরায় স্ন্যাপশট করা

একটি অপরিবর্তিত ফোল্ডার পুনরায় স্ন্যাপশট করলে একই CID ফেরত দেয় — ডিরেক্টরি CID কন্টেন্ট-অ্যাড্রেসড, তাই অভিন্ন কন্টেন্ট সবসময় একই হ্যাশ তৈরি করে, এবং ক্লাস্টারের পিন কল ডুপ্লিকেট চিনতে পারে এবং তার প্রান্তে কোনো কাজ করে না।

দ্রষ্টব্য: ফলাফল একই CID হলেও স্ন্যাপশট পাথটি নিজেই বিনামূল্যে নয়। প্রতিটি কল IPFS থেকে প্রতিটি ফাইলের বাইট ফেরত পড়ে এবং ক্লাস্টারের /add endpoint-এ multipart হিসেবে পুনরায় আপলোড করে — সেখানেই wrap-with-directory র‍্যাপিং হয়। সাধারণ ফোল্ডারের জন্য (≤100 ছোট ফাইল) এটি এখনও কয়েক সেকেন্ডে সম্পন্ন হয়; খুব বড় ফোল্ডারের জন্য কন্টেন্ট প্রকৃতপক্ষে পরিবর্তিত হলে তবেই স্ন্যাপশট কল করা ভালো।

কন্টেন্ট যোগ বা সরানোর পর স্ন্যাপশট কল করলে একটি ভিন্ন CID তৈরি হয়; আপনি এর অন্তর্নিহিত ফাইলগুলি না মোছা পর্যন্ত আগেরটি resolve হতে থাকে।

সীমা

  • ফোল্ডারে অন্তত একটি ফাইল থাকতে হবে। খালি ফোল্ডার 400 — folder is empty ফেরত দেয়।
  • multipart আপলোডে Kubo যে ফাইল-নামের অক্ষরগুলি গ্রহণ করে সেগুলি URL-এনকোডেড থাকে; আপনার ফাইলনামে স্পেস বা নন-ASCII অক্ষরের জন্য গেটওয়ে URL-এ percent-encoding প্রয়োজন হতে পারে।
  • স্ন্যাপশট প্রতিটি অনন্য CID-এর জন্য ঠিক একবার আপনার প্ল্যানের পিন মোটের মধ্যে গণনা হয় — ফাইল ব্লকগুলি deduplicated, তাই স্ন্যাপশট মূলত আপনার আগে থেকে পিন করা ফাইলগুলির উপরে একটি ছোট ডিরেক্টরি নোড যোগ করে।

একটি ফোল্ডার আপডেট করুন

PUT /folders/{folderId}

প্যারামিটারধরনপ্রয়োজনীয়বর্ণনা
namestringনানতুন প্রদর্শন নাম।
parentFolderIdstring | nullনাফোল্ডারটি re-parent করুন। null এটিকে রুটে সরায়।

একটি ফোল্ডার মুছুন

DELETE /folders/{folderId}

ফোল্ডারটি মুছে দেয় এবং এতে থাকা প্রতিটি ফাইল ও সাবফোল্ডারের মধ্য দিয়ে recursively cascade করে। পৃথক ফাইল মোছার মতো একই shared-CID সেফটি গার্ড সাপেক্ষ — যদি অন্য ব্যবহারকারীরা এখনও আপনার আপলোড করা একটি CID পিন করে রাখে, আপনার unpin তাদের জন্য এটি সরায় না।

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

একটি ফোল্ডার/bucket-এর জন্য S3 CORS কনফিগার করুন

S3-সামঞ্জস্যপূর্ণ API-এর মাধ্যমে প্রকাশিত ফোল্ডারগুলি bucket হিসেবে কাজ করে। আপনি যদি ব্রাউজার JavaScript থেকে সেই API চালান, তাহলে ব্রাউজার preflight পাস করার জন্য bucket-এ CORS নিয়ম প্রয়োজন। একই স্টোরে দুটি সমতুল্য surface পার্সিস্ট করে:

  • PUT /folders/{folderId}/cors — এই REST endpoint, JWT-প্রমাণীকৃত (ড্যাশবোর্ড দ্বারা ব্যবহৃত)
  • S3 subresource PUT /{bucket}?cors — SigV4-প্রমাণীকৃত (AWS SDK দ্বারা ব্যবহৃত, s3-compatibility.md দেখুন)

এই endpoint-এ PUT-টি ফোল্ডারের নামটি এখনও claim করা না থাকলে সেটিকে একটি বৈশ্বিকভাবে-অনন্য bucket হিসেবেও claim করে

PUT /folders/{folderId}/cors

ফোল্ডারের S3 bucket-এর জন্য CORS নিয়ম সেট করুন। প্রতি bucket-এ সর্বাধিক ৫টি নিয়ম, মোট ৬৪ KB।

প্যারামিটারধরনপ্রয়োজনীয়বর্ণনা
rulesCorsRule[]হ্যাঁAWS-আকারের CORS নিয়মের অ্যারে (নীচে দেখুন)। খালি নয়।
bucketNamestringনাস্পষ্ট S3 bucket নাম। ডিফল্ট ফোল্ডারের প্রদর্শন নাম। কাঙ্ক্ষিত নাম ইতিমধ্যে বৈশ্বিকভাবে claim করা থাকলে, এখানে একটি বিকল্প পাস করুন।

প্রতিটি CorsRule:

ফিল্ডধরনপ্রয়োজনীয়বর্ণনা
AllowedOriginsstring[]হ্যাঁঅনুরোধ পাঠানোর অনুমতিপ্রাপ্ত origin। ওয়াইল্ডকার্ড সমর্থন করে (https://*.myapp.com)। যেকোনো origin-এর জন্য * ব্যবহার করুন।
AllowedMethodsstring[]হ্যাঁGET, HEAD, PUT, POST, DELETE-এর এক বা একাধিক।
AllowedHeadersstring[]নাব্রাউজার অনুরোধে যে হেডার অন্তর্ভুক্ত করতে পারে। ডিফল্ট: কোনোটিই না। সব অনুমতি দিতে ["*"] ব্যবহার করুন (AWS SDK v3-এর জন্য সুপারিশকৃত, যা Authorization, x-amz-* ইত্যাদি পাঠায়)।
ExposeHeadersstring[]নাব্রাউজার JavaScript-এ পাঠযোগ্য প্রতিক্রিয়া হেডার। আপনার অ্যাপের ফেরত পাওয়া CID প্রয়োজন হলে ETag এবং x-amz-meta-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 নাম (claim করা থাকলে) ফেরত দেয়।

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

DELETE /folders/{folderId}/cors

সমস্ত CORS নিয়ম সরিয়ে দেয়। নতুন নিয়ম সেট না করা পর্যন্ত bucket-এর বিরুদ্ধে ব্রাউজার preflight ব্যর্থ (fail closed) হবে।

ড্যাশবোর্ড বিকল্প

Files পেজে, প্রতিটি ফোল্ডারের অ্যাকশন মেনুতে একটি S3 CORS এন্ট্রি রয়েছে যা একটি ফর্ম-ভিত্তিক এডিটর খোলে। এই REST endpoint এবং S3 API-এর মাধ্যমে PutBucketCors-এর মতো একই আন্ডারলাইং স্টোর।