Direct Upload: presigned URL ও multipart upload
Presigned URLs and Multipart Uploads
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Direct upload ও presigned capability
- Multipart upload ও cleanup
- Upload completion-এর server validation
সমস্যা দিয়ে শুরু
এক gigabyte video Laravel worker দিয়ে stream করলে worker, memory/bandwidth এবং proxy timeout চাপ বাড়ে। Direct upload-এ browser object storage-এ data পাঠায়, application permission ও metadata manage করে। কিন্তু client “upload complete” বললেই trusted video হিসেবে publish করা যাবে না।
সহজ করে বুঝি
Presigned URL নির্দিষ্ট object operation সীমিত সময়ের জন্য authorize করে। Application user permission দেখে server-generated key ও expiry দেয়। Browser সেই capability দিয়ে upload করে। Multipart upload বড় object parts-এ পাঠিয়ে retry/resume সহজ করে; শেষে complete operation parts assemble করে। Incomplete multipart parts storage cost নিতে পারে, তাই abort/lifecycle cleanup দরকার। Content type header user-controlled হতে পারে; file signature, size, checksum ও malware scan server-side pipeline-এ যাচাই করুন।
পরিচিত একটি উপমা
একজন customer-কে warehouse-এর একটি locker-এ parcel রাখার অস্থায়ী token দেওয়া হলো। Token থাকা মানে warehouse desk আপনার হয়ে parcel বহন করবে না। Parcel জমা হওয়ার পরে size ও contents policy পরীক্ষা করে ready label দেওয়া হয়। Token অন্যকে দিলে তিনিও expiry পর্যন্ত ব্যবহার করতে পারেন।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart TD B[Authenticated browser] --> A[Laravel creates upload intent] A --> P[Presigned private object upload] P --> B B --> O[(Object Storage)] B --> C[Confirm upload intent] C --> V[Server checks object and scan] V --> R[(Mark document ready)]
Upload intent owner/key/status database-এ durable রাখুন। Signed URL browser-কে storage capability দেয়। Confirm endpoint সেই intent-এর ownership যাচাই করে object inspect করে। Scan pending থাকলে 202/status response দিয়ে অপেক্ষা দেখানো যায়। Object exists মানেই expected size, content বা rightful tenant-এর file নয়।
PHP ও Laravel-এ প্রয়োগ
Controller fragment; auth route, s3 disk ও AWS adapter/credentials configured। Generated key user filename ব্যবহার করে না। temporaryUploadUrl supported S3 driver-এর API; অন্য disk-এ availability আলাদা। পাঁচ মিনিট example expiry। Production-এ upload intent persist করে size/type budget enforce এবং confirmation/scan workflow যোগ করুন।
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
$userId = auth()->id();
abort_unless($userId !== null, 401);
$key = "pending/{$userId}/".Str::uuid();
$upload = Storage::disk('s3')->temporaryUploadUrl(
$key,
now()->addMinutes(5)
);
return response()->json([
'key' => $key,
'upload_url' => $upload['url'],
'headers' => $upload['headers'],
]);সুবিধা, সীমাবদ্ধতা ও trade-off
Direct upload app bandwidth ও long request occupancy কমায়। CORS, capability handling, completion validation ও orphan cleanup complexity যোগ হয়। Multipart network interruption recovery সাহায্য করে, but part bookkeeping ও completion state লাগে। Small file-এ ordinary Laravel validated upload simpler হতে পারে। Signed URL দীর্ঘদিন valid রাখলে leak exposure বাড়ে; খুব ছোট হলে slow client expire পেতে পারেন।
সাধারণ ভুল
- Client-supplied object key দিয়ে অন্য tenant-এর file confirm করা।
- Browser Content-Type-কে authoritative content validation ধরা।
- Incomplete multipart upload চিরদিন রেখে cost বাড়ানো।
আরও একটু গভীরে
ETag সব upload mode-এ content MD5 নয়; multipart বা encryption-এর behavior অনুযায়ী checksum API ব্যবহার করুন। Object overwrite এড়াতে unique immutable key এবং intent state ব্যবহার করুন। Confirmation repeated হলে idempotent response দিন। Malware scan শেষে quarantine থেকে ready location-এ copy/move-এর semantics object storage অনুযায়ী design করুন। Upload credentials বা presigned query URL logs-এ redact করুন।
মনে রাখুন
Direct upload data plane আলাদা করে; permission ও validation responsibility সরায় না। Server-generated ownership-bound intent রাখুন। Completion, scan, expiry ও cleanup feature-এর অংশ।
নিজে চেষ্টা করুন
Upload URL নেওয়ার পরে browser বন্ধ করলে কোন resource থাকবে লিখুন। Confirm endpoint-এ wrong owner, wrong size, missing object ও duplicate confirmation test plan দিন। Multipart abort policy ও expected cost metric যোগ করুন।
নিজের বোঝা যাচাই করুন
1. Presigned URL login token?
না। নির্দিষ্ট storage operation-এর bearer capability। যার কাছে URL থাকবে তিনি scope/expiry অনুযায়ী ব্যবহার করতে পারেন।
2. Upload finish client বললেই ready?
না। Server object metadata/content policy যাচাই করবে। Scan বা processing লাগলে pending state থাকবে।
3. Multipart কেন?
বড় object-এর parts আলাদা retry/resume করা যায়। তবে initiate, part tracking, complete এবং abort workflow manage করতে হয়।
4. ETag checksum?
সব ক্ষেত্রে নয়। Multipart/encryption mode-এ MD5 ধরে নেবেন না; documented checksum mechanism বেছে নিন।
5. ছোট file-এ direct upload বাধ্যতামূলক?
না। Ordinary validated Laravel upload simpler হতে পারে। Size, concurrency ও deployment constraint decision চালাবে।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।