When the file is a normal customer avatar, the operational constraint is deletion, not throughput. Short answer: use one PUT or a presigned upload for small images; reserve multipart upload for unusually large profile media or unreliable networks. Multipart is a workflow with state, cleanup, and more places for a retry to go wrong. An avatar that is a few megabytes rarely benefits from that machinery.
I have been paged for missed jobs and duplicate deliveries, so I treat an upload as a small state machine even when the UI makes it look like one button. The useful invariant is simple: an avatar key must be replaceable, observable, and removable by a retention job. A retry must not create a second logical object, and deleting a user must not leave hidden upload fragments behind.
The incident pattern behind a small upload
Start with a single object write.…