পাঠ্যক্রম খুলুন
অগ্রসর পর্যায়

File Storage Service: upload, sharing ও lifecycle

File Storage Service

এই পাঠের কুইজ ↓৬ মিনিট পড়াPHP 8.3+ · Laravel 12
এই পাঠের সূচিপত্র

এই পাঠে যা শিখবেন

  • Metadata এবং file bytes আলাদা রাখা
  • Direct upload, quarantine ও completion যাচাই
  • Sharing permission ও object lifecycle design

সমস্যা দিয়ে শুরু

Team storage service-এ সবাই বড় file PHP server দিয়ে upload করছেন। Server restart হলে transfer ভাঙে, অন্য user link guess করে confidential file পাচ্ছেন। Requirements: authenticated upload/download, folders/metadata, sharing এবং deletion। Desktop sync ও collaborative document editing scope-এর বাইরে। File bytes durable object storage-এ, access decisions Laravel-এ; metadata আর object write একই transaction নয় বলে orphan এবং partial state সামলাতে হবে।

সহজ করে বুঝি

Client authorization পেয়ে সীমিত সময়ের upload URL বা multipart session নেয়। Object quarantine prefix-এ যায়। Completion API size, checksum বা documented integrity signal এবং ownership যাচাই করে scanning pipeline শুরু করে। Metadata ready হলে download entitlement দেওয়া হয়। Public object URL access policy নয়। Bucket private রাখুন; object key-এর randomness authorization-এর বিকল্প নয়।

পরিচিত একটি উপমা

Parcel warehouse-এ জমা দিয়ে register-এ owner এবং permission লেখা হয়। Parcel পৌঁছানোর receipt যাচাই না করে ready লেখা ঠিক নয়। Storage rack number জানলেই যেকেউ parcel নিতে পারবেন না; counter-এ permission দেখাতে হয়।

নকশাটি দেখুন

Diagram লোড হচ্ছে…

File service-এ bytes, metadata ও permission আলাদা boundary; completion, scanning এবং cleanup workflow তাদের consistent রাখে।
Diagram-এর text flow দেখুন
flowchart LR
 U[Authenticated client] --> A[Upload authorization]
 A --> S[Temporary upload entitlement]
 S --> O[Quarantine object storage]
 U --> C[Completion verification]
 C --> Q[Scan and validate]
 Q --> M[(Ready metadata)]
 D[Download request] --> P[File policy]
 P --> E[Short lived download URL]

Authorization expected key, owner এবং upload constraints স্থির করে। Object write-এর পরে completion যাচাই করে job পাঠায়। Scan clean হলে metadata ready হয়। Download request current sharing policy দেখে signed entitlement দেয়। Scan fail হলে object quarantine-এ থাকে বা retention policy অনুযায়ী মুছে যায়। User-controlled filename শুধু display metadata; storage path নিজে বানান।

PHP ও Laravel-এ প্রয়োগ

Assumption: দৈনিক ১০ হাজার file, average ২০MB হলে দিনে প্রায় ২০০GB raw growth; retention, versions ও transfer আলাদা cost। POST /uploads, POST /uploads/{id}/complete, GET /files/{id}/download। files-এ owner,object_key,size,checksum,status; shares-এ subject/permission। নিচের Laravel controller fragment Gate policy enforce করে temporary URL দেয়; s3 disk private এবং driver temporaryUrl supported ধরে নেওয়া হয়েছে।

php
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
Gate::authorize('download', $file);
abort_unless($file->status === 'ready', 409);
$url = Storage::disk('s3')->temporaryUrl(
    $file->object_key,
    now()->addMinutes(5),
);
return response()->json(['url' => $url]);

সুবিধা, সীমাবদ্ধতা ও trade-off

Direct upload app bandwidth কমায়, কিন্তু completion verification ও orphan cleanup লাগে। Short-lived URL efficient delivery দেয়, expiry পর্যন্ত bearer access থাকতে পারে; immediate revoke requirement ভিন্ন design চাইতে পারে। Versioning accidental overwrite recovery বাড়ায়, cost ও deletion policy জটিল করে। Dedup content hash দিয়ে করা যায়, কিন্তু cross-user existence leak ও encrypted object semantics চিনতে হবে।

সাধারণ ভুল

  • Original filename সরাসরি filesystem path বানানো।
  • Upload URL পাওয়াকেই successful upload ধরা।
  • Signed URL unbounded সময়ের জন্য log করা।

আরও একটু গভীরে

Large multipart upload incomplete থাকলে cleanup lifecycle লাগতে পারে। Metadata delete এবং object delete eventual workflow; tombstone state accidental reappearance ঠেকাতে সাহায্য করে। Legal hold বা retention requirement deletion semantics বদলায়। Malware scanner unavailable হলে fail-open/closed policy লিখুন। Download content disposition ও content type safeভাবে দিন; untrusted HTML একই application origin-এ render করবেন না।

মনে রাখুন

File service-এ bytes, metadata ও permission আলাদা boundary; completion, scanning এবং cleanup workflow তাদের consistent রাখে।

নিজে চেষ্টা করুন

Object upload সফল কিন্তু completion API হারানো scenario design করুন। Client completion retry, scan duplicate এবং owner share revoke-এর পর existing signed URL-এর behavior লিখুন। Storage lifecycle cleanup test পরিকল্পনা দিন।

নিজের বোঝা যাচাই করুন

1. Object key secret হলেই নিরাপদ?

না। Permission explicitভাবে check করুন। Random path exposure কমাতে পারে, policy replacement নয়।

2. Direct upload লাভ কী?

বড় byte transfer app worker bypass করে। তবে ownership, size/integrity এবং completion verification দরকার।

3. Signed URL revoke সহজ?

Expiry পর্যন্ত usable থাকতে পারে। Immediate revocation requirement থাকলে key/policy/proxy strategy আলাদা ভাবুন।

4. Delete atomic?

Database metadata ও object storage আলাদা system। Tombstone, retryable cleanup ও audit দিয়ে workflow সামলান।

5. Scan কেন quarantine-এ?

Untrusted content ready হওয়ার আগে isolate করতে। Failure বা malicious file public-serving path-এ না যাওয়া উচিত।

আরও পড়ুন

এই পাঠের কুইজ

এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।

এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।

জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।

সব বিষয় মিলিয়ে অনুশীলন করুন →

অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।