Files & Object Storage
Uploads that do not go through your process, the bucket/key/object primitive underneath every provider's SDK, and what still has to happen after the bytes land.
The obvious path — client to backend to storage — makes your request handler a bandwidth-bound file mover, and it is still the right answer sometimes.
Your backend issues a signed, expiring permission slip; the client uploads directly to storage; your process never sees a byte — which is the benefit and the cost.
A bucket holds objects addressed by a key. That primitive — not any provider's SDK — is what you are actually programming against.
File size, privacy, scanning, processing and serving decide the architecture. There is no default that is right for all five.
Stored is not ready. Scanning, transcoding and thumbnailing are background work with a state machine, and skipping the state machine is how unscanned files get served.
Private files need a check on every read; public files need a CDN. Serving both through your API is the one option that is wrong for both.