Skip to content

S3 সামঞ্জস্যতা

AWS SDK ব্যবহার করে IPFS Ninja-তে ফাইল আপলোড, ডাউনলোড এবং পরিচালনা করুন — Amazon S3-এর জন্য যে কোড ব্যবহার করেন সেই একই কোড দিয়ে।

Endpoint

https://s3.ipfs.ninja

শংসাপত্র

S3 API আপনার IPFS Ninja API কী প্রমাণীকরণের জন্য ব্যবহার করে। আপনার API কী access key এবং secret key উভয় হিসেবে কাজ করে।

কীভাবে আপনার শংসাপত্র পাবেন

  1. Dashboard > API Keys-এ যান
  2. Create API key ক্লিক করুন এবং একটি নাম দিন (যেমন "S3 access")
  3. সম্পূর্ণ কী অবিলম্বে কপি করুন — এটি শুধুমাত্র একবার দেখানো হয় এবং পরে পুনরুদ্ধার করা যায় না

আপনার কী এইরকম দেখায়:

bws_628bba35e9e0079d9ff9c392b1b55a7b
├──────────┘└──────────────────────────┘
 prefix (12 chars)    rest of key

AWS শংসাপত্রে ম্যাপিং

AWS প্যারামিটারমানউদাহরণ
accessKeyIdআপনার API কী-এর প্রথম ১২টি অক্ষরbws_628bba35
secretAccessKeyসম্পূর্ণ API কী (সব ৩৬টি অক্ষর)bws_628bba35e9e0079d9ff9c392b1b55a7b
regionসর্বদা us-east-1us-east-1

WARNING

সম্পূর্ণ API কী শুধুমাত্র তৈরি করার সময় একবার দেখানো হয়। যদি হারিয়ে ফেলেন, কীটি মুছে ফেলুন এবং API Keys পেজ থেকে নতুন একটি তৈরি করুন।

দ্রুত শুরু

javascript
import { S3Client, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3";

const s3 = new S3Client({
  endpoint: "https://s3.ipfs.ninja",
  credentials: {
    accessKeyId: "bws_628bba35",
    secretAccessKey: "bws_628bba35e9e0079d9ff9c392b1b55a7b"
  },
  region: "us-east-1",
  forcePathStyle: true
});

// Upload a file
const put = await s3.send(new PutObjectCommand({
  Bucket: "my-project",
  Key: "hello.json",
  Body: JSON.stringify({ hello: "IPFS" }),
  ContentType: "application/json"
}));

console.log("CID:", put.Metadata?.cid);
// CID: QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy

Buckets = ফোল্ডার

S3 bucket গুলি আপনার IPFS Ninja ফোল্ডারে ম্যাপ হয়। আপনি যখন একটি bucket-এ ফাইল আপলোড করেন, এটি সংশ্লিষ্ট ফোল্ডারে সংরক্ষিত হয়। যখন আপনি একটি bucket-এ অবজেক্ট তালিকা করেন, আপনি সেই ফোল্ডারের ফাইলগুলি দেখতে পান।

S3 অপারেশনIPFS Ninja সমতুল্য
CreateBucketনতুন ফোল্ডার তৈরি
ListBucketsআপনার ফোল্ডারের তালিকা
DeleteBucketফোল্ডার এবং এর সব ফাইল মুছুন
PutObject bucket-এফোল্ডারে ফাইল আপলোড
ListObjectsV2 bucket-এফোল্ডারের ফাইলের তালিকা
javascript
import { ListBucketsCommand, CreateBucketCommand, PutObjectCommand } from "@aws-sdk/client-s3";

// Create a bucket (= create a folder)
await s3.send(new CreateBucketCommand({ Bucket: "nft-metadata" }));

// Upload a file into the folder
await s3.send(new PutObjectCommand({
  Bucket: "nft-metadata",      // ← folder name
  Key: "token-42.json",        // ← filename within the folder
  Body: JSON.stringify({ name: "My NFT #42" })
}));

// List buckets (= list your folders)
const { Buckets } = await s3.send(new ListBucketsCommand({}));
console.log(Buckets);
// [{ Name: "nft-metadata", CreationDate: "2026-04-13T..." }]

TIP

S3 API-এর মাধ্যমে তৈরি ফোল্ডারগুলি আপনার Dashboard-এ দৃশ্যমান একই ফোল্ডার। আপনি S3 API, REST API বা ওয়েব ইন্টারফেস — যেকোনো জায়গা থেকে ফাইল সংগঠিত করতে পারেন — সবগুলি একই ফোল্ডার সিস্টেম শেয়ার করে।

INFO

Amazon S3-এর বিপরীতে, IPFS Ninja ফোল্ডারগুলি ডিফল্টভাবে সমতল। নেস্টেড কাঠামো তৈরি করতে, REST API-এর ফোল্ডার endpoint গুলি parentFolderId সহ ব্যবহার করুন। S3 API থেকে, ফোল্ডারের মধ্যে সংগঠিত করতে কী প্রিফিক্স ব্যবহার করুন (যেমন images/photo.png)।

সমর্থিত অপারেশন

PutObject

IPFS-এ একটি ফাইল আপলোড করুন। ফাইলটি পিন করা হয়, নিরাপত্তা স্ক্যান করা হয় এবং CID ETag এবং x-amz-meta-cid হেডারে ফেরত দেওয়া হয়।

javascript
import { PutObjectCommand } from "@aws-sdk/client-s3";
import fs from "fs";

const result = await s3.send(new PutObjectCommand({
  Bucket: "my-project",
  Key: "photo.png",
  Body: fs.readFileSync("photo.png"),
  ContentType: "image/png"
}));

console.log("CID:", result.ETag);
bash
# curl equivalent
curl -X PUT "https://s3.ipfs.ninja/my-project/photo.png" \
  --data-binary @photo.png \
  -H "Content-Type: image/png" \
  --aws-sigv4 "aws:amz:us-east-1:s3" \
  --user "bws_628bba35:bws_628bba35e9e0079d9ff9c392b1b55a7b"

GetObject

কী (ফাইলনাম) বা CID দিয়ে একটি ফাইল ডাউনলোড করুন।

javascript
import { GetObjectCommand } from "@aws-sdk/client-s3";

const result = await s3.send(new GetObjectCommand({
  Bucket: "my-project",
  Key: "photo.png"
}));

const body = await result.Body.transformToByteArray();
console.log("Size:", body.length);
console.log("CID:", result.Metadata?.cid);

HeadObject

কন্টেন্ট ডাউনলোড না করে ফাইলের মেটাডেটা পান।

javascript
import { HeadObjectCommand } from "@aws-sdk/client-s3";

const head = await s3.send(new HeadObjectCommand({
  Bucket: "my-project",
  Key: "photo.png"
}));

console.log("Size:", head.ContentLength);
console.log("Type:", head.ContentType);
console.log("CID:", head.Metadata?.cid);

DeleteObject

IPFS থেকে একটি ফাইল আনপিন করুন এবং আপনার অ্যাকাউন্ট থেকে মুছে ফেলুন।

javascript
import { DeleteObjectCommand } from "@aws-sdk/client-s3";

await s3.send(new DeleteObjectCommand({
  Bucket: "my-project",
  Key: "photo.png"
}));

ListObjectsV2

ঐচ্ছিক প্রিফিক্স ফিল্টারিং এবং পেজিনেশন সহ একটি bucket-এ ফাইলের তালিকা করুন।

javascript
import { ListObjectsV2Command } from "@aws-sdk/client-s3";

const list = await s3.send(new ListObjectsV2Command({
  Bucket: "my-project",
  Prefix: "images/",
  MaxKeys: 100
}));

for (const obj of list.Contents ?? []) {
  console.log(obj.Key, obj.Size, obj.ETag); // ETag = CID
}

Multipart Upload

multipart upload ব্যবহার করে বড় ফাইল (৫ GB পর্যন্ত) আপলোড করুন। AWS SDK স্বয়ংক্রিয়ভাবে এটি পরিচালনা করে:

javascript
import { Upload } from "@aws-sdk/lib-storage";
import fs from "fs";

const upload = new Upload({
  client: s3,
  params: {
    Bucket: "my-project",
    Key: "large-dataset.tar.gz",
    Body: fs.createReadStream("large-dataset.tar.gz"),
    ContentType: "application/gzip"
  },
  partSize: 10 * 1024 * 1024, // 10 MB per part
});

upload.on("httpUploadProgress", (progress) => {
  console.log(`Uploaded ${progress.loaded} of ${progress.total} bytes`);
});

const result = await upload.done();
console.log("CID:", result.ETag);

অথবা ম্যানুয়ালি পার্ট নিয়ন্ত্রণ করুন:

javascript
import {
  CreateMultipartUploadCommand,
  UploadPartCommand,
  CompleteMultipartUploadCommand
} from "@aws-sdk/client-s3";

// 1. Start
const { UploadId } = await s3.send(new CreateMultipartUploadCommand({
  Bucket: "my-project",
  Key: "big-file.bin"
}));

// 2. Upload parts
const part1 = await s3.send(new UploadPartCommand({
  Bucket: "my-project",
  Key: "big-file.bin",
  UploadId,
  PartNumber: 1,
  Body: chunk1
}));

// 3. Complete
const result = await s3.send(new CompleteMultipartUploadCommand({
  Bucket: "my-project",
  Key: "big-file.bin",
  UploadId,
  MultipartUpload: {
    Parts: [{ PartNumber: 1, ETag: part1.ETag }]
  }
}));

Python উদাহরণ

python
import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="https://s3.ipfs.ninja",
    aws_access_key_id="bws_628bba35",
    aws_secret_access_key="bws_628bba35e9e0079d9ff9c392b1b55a7b",
    region_name="us-east-1"
)

# Upload
s3.put_object(
    Bucket="my-project",
    Key="data.json",
    Body=b'{"hello": "IPFS"}',
    ContentType="application/json"
)

# List files
response = s3.list_objects_v2(Bucket="my-project")
for obj in response.get("Contents", []):
    print(obj["Key"], obj["Size"])

# Download
result = s3.get_object(Bucket="my-project", Key="data.json")
print(result["Body"].read())

Go উদাহরণ

go
package main

import (
    "context"
    "fmt"
    "strings"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/credentials"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    client := s3.New(s3.Options{
        BaseEndpoint: aws.String("https://s3.ipfs.ninja"),
        Region:       "us-east-1",
        Credentials:  credentials.NewStaticCredentialsProvider("bws_628bba35", "bws_628bba35e9e0...", ""),
        UsePathStyle: true,
    })

    _, err := client.PutObject(context.TODO(), &s3.PutObjectInput{
        Bucket:      aws.String("my-project"),
        Key:         aws.String("hello.txt"),
        Body:        strings.NewReader("Hello, IPFS!"),
        ContentType: aws.String("text/plain"),
    })
    if err != nil {
        panic(err)
    }
    fmt.Println("Uploaded!")
}

Amazon S3-এর সাথে পার্থক্য

বৈশিষ্ট্যAmazon S3IPFS Ninja S3
স্টোরেজ মডেলপরিবর্তনযোগ্য অবজেক্টকন্টেন্ট-অ্যাড্রেসড (অপরিবর্তনীয় CID)
ওভাররাইট আচরণঅবজেক্ট স্থানে প্রতিস্থাপননতুন CID তৈরি হয়, পুরানো CID এখনও অ্যাক্সেসযোগ্য
ভার্সনিংসমর্থিতসমর্থিত নয় (ভার্সনিং-এর জন্য CID ব্যবহার করুন)
সার্ভার-সাইড এনক্রিপশনসমর্থিতসমর্থিত নয় (কন্টেন্ট IPFS-এ রয়েছে)
লাইফসাইকেল পলিসিসমর্থিতসমর্থিত নয়
Bucket পলিসি / ACLসমর্থিতগেটওয়ে অ্যাক্সেস মোড ব্যবহার করুন
প্রিসাইনড URLসমর্থিতসাইনড আপলোড টোকেন ব্যবহার করুন
সর্বোচ্চ অবজেক্ট সাইজ5 TB5 GB (multipart), 100 MB (একক PUT)
রিজিওনমাল্টি-রিজিওনশুধুমাত্র us-east-1
ETag মানMD5 হ্যাশIPFS CID
অতিরিক্ত হেডারস্ট্যান্ডার্ড S3x-amz-meta-cid (IPFS CID)

Amazon S3 থেকে মাইগ্রেশন

আপনার S3 ক্লায়েন্ট কনফিগারেশন প্রতিস্থাপন করুন:

diff
 const s3 = new S3Client({
+  endpoint: "https://s3.ipfs.ninja",
   credentials: {
-    accessKeyId: "AKIA...",
-    secretAccessKey: "wJalrX..."
+    accessKeyId: "bws_628bba35",
+    secretAccessKey: "bws_628bba35e9e0..."
   },
   region: "us-east-1",
+  forcePathStyle: true
 });

আপনার বিদ্যমান PutObject, GetObject, ListObjectsV2 এবং DeleteObject কল কোনো পরিবর্তন ছাড়াই কাজ করবে।

Filebase থেকে মাইগ্রেশন

Endpoint URL প্রতিস্থাপন করুন:

diff
 const s3 = new S3Client({
-  endpoint: "https://s3.filebase.com",
+  endpoint: "https://s3.ipfs.ninja",
   credentials: {
-    accessKeyId: "FILEBASE_KEY",
-    secretAccessKey: "FILEBASE_SECRET"
+    accessKeyId: "bws_628bba35",
+    secretAccessKey: "bws_628bba35e9e0..."
   },
   region: "us-east-1",
   forcePathStyle: true
 });