If you just want the recommendation: have your Node.js API mint a short-lived presigned URL, let the browser send the file straight into a private bucket, and keep the object key in your own database. For a SaaS app with customers on both sides of the Atlantic, run one bucket in a US region and one in the EU, and let the tenant record decide which one a given direct upload lands in. Any S3-compatible store handles the upload itself; the differences that matter are residency, what the signature is allowed to constrain, and how much of your code you rewrite the day you change vendors.
I design storage and data layers for a living, so here's my bias up front: I don't believe durability numbers printed on landing pages, and the first thing I ask a vendor is what happens when a client retries.
The upload is rarely the hard part. The bookkeeping afterwards is.
Should the browser upload straight to object storage, or should Node.js proxy the bytes?
Direct, in almost every case. Proxying is what you do when something forces it — a scanner that has to see the bytes before they become durable, a contract that says customer data can't touch a third party unmediated — and each of those reasons costs you real money in process time, so make somebody say it out loud before you accept it.






