AWS SDK S3 Examples: Upload, Download, Presigned URLs आणि Multipart (Python, PHP, Node.js)
बहुतेक apps code मधून सगळ्यात आधी S3 call करतात. Dubai मधल्या Aisha च्या studio आणि Nashik मधल्या Ravi च्या print shop साठी छोटा photo store बनवू: bucket, files upload व download, list, presigned URL ने private file share, आणि मोठा video parts मध्ये upload — Python, PHP आणि Node.js मध्ये.
या chapter मध्ये तुम्ही काय शिकाल
- Code मधून bucket बनवा
- Files upload आणि download
- Prefix सह objects list
- Presigned GET आणि PUT URLs
- Multipart ने मोठ्या files
1. मोठं चित्र: locker room
हे का लागतं?
Gym प्रत्येक member ला नंबर असलेला locker देतो. बॅग ठेवा, काढा, किंवा मित्राला 10 मिनिटं चालणारा one-time pass द्या. S3 म्हणजे locker room: bucket = room, key = locker नंबर, object = बॅग, presigned URL = one-time pass.
हे काय आहे?
Python चं upload_file/download_file multipart आपोआप करतं. PHP मध्ये putObject आणि MultipartUploader. Node मध्ये PutObjectCommand आणि @aws-sdk/lib-storage मधला Upload class.
कसं करायचं (step by step)
2. Bucket बनवा आणि upload
हे का लागतं?
Aisha ला प्रत्येक client photo shoot एका laptop वर नाही, safe ठिकाणी हवा.
हे काय आहे?
us-east-1 सोडून LocationConstraint द्यावा लागतो. ContentType द्या म्हणजे browser image download न करता दाखवतो.
कसं करायचं (step by step)
- Python: bucket बनवून file upload.
import boto3
s3 = boto3.client("s3", region_name="me-central-1")
bucket = "aisha-studio-111122223333"
s3.create_bucket(Bucket=bucket, CreateBucketConfiguration={"LocationConstraint": "me-central-1"})
s3.upload_file("shoot-01.jpg", bucket, "2026/oct/shoot-01.jpg", ExtraArgs={"ContentType": "image/jpeg"})
print("Uploaded to", bucket)
अपेक्षित output:
Uploaded to aisha-studio-111122223333
- PHP: file path ने putObject.
<?php
require "vendor/autoload.php";
use Aws\S3\S3Client;
$s3 = new S3Client(["region" => "ap-south-1"]);
$bucket = "ravi-prints-nashik-111122223333";
$s3->createBucket(["Bucket" => $bucket, "CreateBucketConfiguration" => ["LocationConstraint" => "ap-south-1"]]);
$s3->waitUntil("BucketExists", ["Bucket" => $bucket]);
$r = $s3->putObject(["Bucket" => $bucket, "Key" => "orders/inv-1001.pdf", "SourceFile" => "inv-1001.pdf", "ContentType" => "application/pdf"]);
echo "ETag: ", $r["ETag"], PHP_EOL;
अपेक्षित output:
ETag: "9b2cf535f27731c974343645a3985328"
- Node.js: file stream सह PutObjectCommand.
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { createReadStream, statSync } from "node:fs";
const s3 = new S3Client({ region: "eu-central-1" });
const r = await s3.send(new PutObjectCommand({
Bucket: "lena-cafe-berlin-111122223333",
Key: "menu/autumn.png",
Body: createReadStream("autumn.png"),
ContentLength: statSync("autumn.png").size,
ContentType: "image/png",
}));
console.log("ETag:", r.ETag);
अपेक्षित output:
ETag: "5d41402abc4b2a76b9719d911017c592"
- Verify: object आहे.
aws s3 ls s3://aisha-studio-111122223333/2026/oct/
अपेक्षित output:
2026-10-24 10:15:02 245760 shoot-01.jpg
3. Download आणि list
हे का लागतं?
Ravi ला invoice PDF परत shop PC वर हवी, आणि October च्या सगळ्या orders ची list.
हे काय आहे?
GetObject stream देतो. Prefix folder सारखं filter करतो. 1,000 पेक्षा जास्त keys असतील तर paginator.
कसं करायचं (step by step)
- Python: download आणि prefix ने list.
import boto3
s3 = boto3.client("s3", region_name="ap-south-1")
b = "ravi-prints-nashik-111122223333"
s3.download_file(b, "orders/inv-1001.pdf", "copy-inv-1001.pdf")
for o in s3.list_objects_v2(Bucket=b, Prefix="orders/").get("Contents", []):
print(o["Key"], o["Size"])
अपेक्षित output:
orders/inv-1001.pdf 48213
- PHP: SaveAs सह getObject.
<?php
require "vendor/autoload.php";
$s3 = new Aws\S3\S3Client(["region" => "ap-south-1"]);
$b = "ravi-prints-nashik-111122223333";
$s3->getObject(["Bucket" => $b, "Key" => "orders/inv-1001.pdf", "SaveAs" => "copy-inv-1001.pdf"]);
foreach ($s3->listObjectsV2(["Bucket" => $b, "Prefix" => "orders/"])["Contents"] as $o) {
echo $o["Key"], " ", $o["Size"], PHP_EOL;
}
अपेक्षित output:
orders/inv-1001.pdf 48213
- Node.js: body string म्हणून वाचा.
import { S3Client, PutObjectCommand, GetObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
const s3 = new S3Client({ region: "eu-central-1" });
const B = "lena-cafe-berlin-111122223333";
await s3.send(new PutObjectCommand({ Bucket: B, Key: "menu/today.txt", Body: "Apfelstrudel €4.50" }));
const obj = await s3.send(new GetObjectCommand({ Bucket: B, Key: "menu/today.txt" }));
console.log(await obj.Body.transformToString());
const list = await s3.send(new ListObjectsV2Command({ Bucket: B, Prefix: "menu/" }));
console.log(list.Contents.map(o => o.Key));
अपेक्षित output:
Apfelstrudel €4.50
[ 'menu/autumn.png', 'menu/today.txt' ]
- Verify: download केलेली file जुळते.
ls -l copy-inv-1001.pdf | awk '{print $5}'
अपेक्षित output:
48213
4. Presigned URLs
हे का लागतं?
Aisha चा New York मधला client 40 photos download करणार, पण bucket private राहायला हवा. Presigned URL AWS login शिवाय ठराविक वेळेसाठी access देतो.
हे काय आहे?
SDK तुमच्या credentials ने URL locally sign करतो. GET URL ने download; PUT URL ने browser थेट S3 मध्ये upload, तुमच्या server मधून न जाता.
कसं करायचं (step by step)
- Python: 1 तासाची download link.
import boto3
s3 = boto3.client("s3", region_name="me-central-1")
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": "aisha-studio-111122223333", "Key": "2026/oct/shoot-01.jpg"},
ExpiresIn=3600,
)
print(url[:80])
अपेक्षित output:
https://aisha-studio-111122223333.s3.me-central-1.amazonaws.com/2026/oct/shoot-0
- PHP: createPresignedRequest.
<?php
require "vendor/autoload.php";
$s3 = new Aws\S3\S3Client(["region" => "ap-south-1"]);
$cmd = $s3->getCommand("GetObject", ["Bucket" => "ravi-prints-nashik-111122223333", "Key" => "orders/inv-1001.pdf"]);
$req = $s3->createPresignedRequest($cmd, "+15 minutes");
echo (string) $req->getUri(), PHP_EOL;
अपेक्षित output:
https://ravi-prints-nashik-111122223333.s3.ap-south-1.amazonaws.com/orders/inv-1001.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&...&X-Amz-Expires=900&X-Amz-Signature=...
- Node.js: browser upload साठी presigned PUT URL.
// npm install @aws-sdk/s3-request-presigner
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
const s3 = new S3Client({ region: "eu-central-1" });
const url = await getSignedUrl(s3, new PutObjectCommand({
Bucket: "lena-cafe-berlin-111122223333", Key: "uploads/review.jpg", ContentType: "image/jpeg",
}), { expiresIn: 600 });
console.log(url.split("?")[0]);
अपेक्षित output:
https://lena-cafe-berlin-111122223333.s3.eu-central-1.amazonaws.com/uploads/review.jpg
- Verify: AWS login शिवाय curl ने download.
curl -s -o test.jpg -w "%{http_code}\n" "$URL"
अपेक्षित output:
200
- Verify: PUT URL ने upload.
curl -s -X PUT -H "Content-Type: image/jpeg" --data-binary @review.jpg -w "%{http_code}\n" "$PUT_URL"
अपेक्षित output:
200
5. मोठ्या files साठी multipart upload
हे का लागतं?
Sydney मधला James 3 GB wedding video upload करतो. एक PUT 5 GB पर्यंतच, आणि एक network blip सगळं परत सुरू करतं. Multipart parts parallel पाठवतो आणि फक्त fail झालेला part retry करतो.
हे काय आहे?
Parts किमान 5 MB (शेवटचा सोडून), जास्तीत जास्त 10,000 parts. High-level helpers create, parts upload आणि complete आपोआप करतात.
कसं करायचं (step by step)
- Python: TransferConfig threshold आणि threads ठरवतो.
import boto3
from boto3.s3.transfer import TransferConfig
cfg = TransferConfig(multipart_threshold=64 * 1024 * 1024, multipart_chunksize=64 * 1024 * 1024, max_concurrency=8)
s3 = boto3.client("s3", region_name="ap-southeast-2")
s3.upload_file("wedding.mp4", "james-films-sydney-111122223333", "raw/wedding.mp4", Config=cfg)
head = s3.head_object(Bucket="james-films-sydney-111122223333", Key="raw/wedding.mp4")
print("ETag:", head["ETag"])
अपेक्षित output:
ETag: "d41d8cd98f00b204e9800998ecf8427e-48"
- PHP: MultipartUploader.
<?php
require "vendor/autoload.php";
use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;
$s3 = new Aws\S3\S3Client(["region" => "ap-southeast-2"]);
$up = new MultipartUploader($s3, "wedding.mp4", ["bucket" => "james-films-sydney-111122223333", "key" => "raw/wedding.mp4", "part_size" => 64 * 1024 * 1024, "concurrency" => 5]);
try {
$r = $up->upload();
echo "Done: ", $r["ObjectURL"], PHP_EOL;
} catch (MultipartUploadException $e) {
echo "Failed: ", $e->getMessage(), PHP_EOL;
}
अपेक्षित output:
Done: https://james-films-sydney-111122223333.s3.ap-southeast-2.amazonaws.com/raw/wedding.mp4
- Node.js: progress सह @aws-sdk/lib-storage चा Upload.
// npm install @aws-sdk/lib-storage
import { S3Client } from "@aws-sdk/client-s3";
import { Upload } from "@aws-sdk/lib-storage";
import { createReadStream } from "node:fs";
const up = new Upload({
client: new S3Client({ region: "ap-southeast-2" }),
params: { Bucket: "james-films-sydney-111122223333", Key: "raw/wedding.mp4", Body: createReadStream("wedding.mp4") },
partSize: 64 * 1024 * 1024, queueSize: 4,
});
up.on("httpUploadProgress", p => console.log("part", p.part, p.loaded));
const r = await up.done();
console.log("Done:", r.Key);
अपेक्षित output:
part 1 67108864
part 2 134217728
...
Done: raw/wedding.mp4
- Verify: ETag शेवटी -partcount, अर्धवट uploads नाहीत.
aws s3api head-object --bucket james-films-sydney-111122223333 --key raw/wedding.mp4 --query ETag --output text
aws s3api list-multipart-uploads --bucket james-films-sydney-111122223333 --query "length(Uploads || `[]`)"
अपेक्षित output:
"d41d8cd98f00b204e9800998ecf8427e-48"
0
6. हाच call Java, Go, .NET आणि CLI मध्ये
हे का लागतं?
Teams अनेकदा भाषा मिसळतात. Python, PHP आणि Node.js मध्ये call समजला की बाकीचे SDKs म्हणजे तोच API, फक्त syntax वेगळा.
हे काय आहे?
सगळे PutObject API call करतात. Terminal मधून पटकन test करायला CLI ओळ वापरा.
कसं करायचं (step by step)
| Stack | Code |
|---|---|
| AWS CLI | aws s3 cp f s3://b/k |
| Java v2 | s3.putObject(PutObjectRequest.builder().bucket("b").key("k").build(), RequestBody.fromFile(Paths.get("f"))); |
| Go v2 | f, _ := os.Open("f") |
| .NET | await s3.PutObjectAsync(new PutObjectRequest { BucketName = "b", Key = "k", FilePath = "f" }); |
7. काहीही खर्च चालू राहू नये म्हणून cleanup
हे का लागतं?
चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.
हे काय आहे?
उलट्या क्रमाने delete करा: आधी children, मग parents.
कसं करायचं (step by step)
- Python: bucket रिकामा करून delete.
import boto3
b = boto3.resource("s3").Bucket("aisha-studio-111122223333")
b.objects.all().delete()
b.delete()
print("deleted")
अपेक्षित output:
deleted
- अर्धवट multipart uploads abort करा.
aws s3api list-multipart-uploads --bucket james-films-sydney-111122223333 --query "Uploads[].[Key,UploadId]" --output text
अपेक्षित output:
(no output means success)
Ravindra Bagale's Tip
"AbortIncompleteMultipartUpload after 7 days" lifecycle rule लावा. Fail झालेले multipart parts console मध्ये दिसत नाहीत पण पैसे लागतात.
8. मुलाखत प्रश्न आणि उत्तरं
प्र. boto3 मध्ये put_object ऐवजी upload_file का?
आपोआप multipart, parallel parts, retries.
प्र. Presigned URL म्हणजे काय?
एका object साठी ठराविक वेळेचा signed GET/PUT URL.
प्र. Multipart चा minimum part size?
5 MB (शेवटचा सोडून), 10,000 parts पर्यंत.
प्र. Node v3 मध्ये S3 body कशी वाचायची?
transformToString() किंवा stream pipe.
प्र. Presigned URL credentials पेक्षा जास्त टिकतो का?
नाही, temporary credentials expire झाले की बंद.
घरी करून बघा
- प्रत्येक भाषेत folder मधले सगळे .jpg upload करून प्रत्येकासाठी presigned link print करा.
- 7 दिवसांनी अर्धवट multipart uploads abort करणारा lifecycle rule लावा.
थोडक्यात सांगायचं तर
- us-east-1 बाहेर LocationConstraint.
- upload_file / putObject / PutObjectCommand.
- List साठी Prefix आणि paginators.
- Private sharing साठी presigned GET/PUT.
- मोठ्या files साठी multipart; उरलेले abort.
सराव Tasks
New York News Daily हा न्यूयॉर्क मधला मीडिया व्यवसाय आहे. Rachel Cohen त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे USD मध्ये मोजले जातात आणि AWS resources us-east-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 12
सोपं Distributions दाखवा
का: Distribution ID व domain नाव शोधा.
काय करायचं: सगळे CloudFront distributions दाखवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं S3 वर file upload करा
का: aws s3 cp Linux cp सारखं, फक्त एक बाजू S3.
काय करायचं: report.pdf ला s3://nynewsdaily-invoices-2026/reports/report.pdf वर upload करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Temporary download link बनवा
का: Pre-signed URL ने bucket public न करता एक private file थोड्या वेळासाठी share होते.
काय करायचं: s3://nynewsdaily-invoices-2026/inv-101.pdf साठी 3600 seconds मध्ये expire होणारा pre-signed URL बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम CloudFront cache साफ करा
का: Deploy नंतर invalidate करा म्हणजे visitors ना नव्या files लगेच मिळतात.
काय करायचं: Distribution E2QWRUHAPOMQZL वर सगळे paths (/*) invalidate करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम पूर्ण S3 folder download करा
का: --recursive ने cp prefix खालचे सगळे objects copy करतो.
काय करायचं: s3://nynewsdaily-invoices-2026/2026/ खालचं सगळं ./invoices folder मध्ये download करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Object चा metadata वाचा
का: head-object file download न करता size, type व version दाखवतो.
काय करायचं: nynewsdaily-media bucket मधल्या reels/v1.mp4 key चा metadata दाखवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Public website साठी bucket policy
का: Static website bucket ने सगळ्यांना files वाचू द्याव्या.
काय करायचं: nynewsdaily-site मधल्या प्रत्येक object वर कोणालाही (*) s3:GetObject करू देणारी bucket policy लिहा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम एक bucket list व read
का: ListBucket bucket ARN वर; GetObject object ARNs वर चालतो.
काय करायचं: nynewsdaily-data bucket वर s3:ListBucket व सगळ्या objects वर s3:GetObject allow करा. बाकी काही नाही.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
अवघड CloudFront OAC साठी bucket policy
का: OAC मुळे फक्त तुमचा CloudFront distribution private bucket वाचतो.
काय करायचं: cloudfront.amazonaws.com ला nynewsdaily-site/* वर s3:GetObject allow, फक्त aws:SourceArn = arn:aws:cloudfront::127812880530:distribution/E2QWRUHAPOMQZL असेल तेव्हा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
अवघड Origin Access Control बनवा
का: OAC मुळे फक्त CloudFront तुमचा private S3 bucket वाचू शकतो.
काय करायचं: oac.json पासून origin access control बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड CloudFront signed URL बनवा
का: Signed URLs मुळे फक्त पैसे भरलेले users ठराविक वेळ video पाहू शकतात.
काय करायचं: https://d111.cloudfront.net/course/intro.mp4 ला key pair ID K2JCJMDEHXQW5F, private key private_key.pem ने sign करा, 2026-12-31 ला expire.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Config file पासून distribution बनवा
का: पूर्ण config JSON मध्ये ठेवणं सोपं.
काय करायचं: dist.json पासून CloudFront distribution बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.




अजून cards: Ravi Sir's Cards.