Better file uploadsfor developers
Developers deserve better than S3. That's why we made UploadThing, the easier (and safer) alternative. From the button to the server, we've got you covered.
Your Auth. Our Bandwidth.
The right balance of security and simplicity.
Authentication happens on your server, the upload happens on ours.
Server Code
export const fileRouter = {
imageUploader: f({ image: { maxFileSize: "4MB" } })
.middleware(async ({ req }) => {
// This code runs on your server before upload
const user = await auth(req);
// Throw to block uploading
if (!user)
throw new UploadThingError("Unauthorized");
// Return metadata to client
return { userId: user.id };
})
.onUploadComplete(async ({ metadata, file }) => ...),
} satisfies FileRouter;
Client Code
<UploadButton
endpoint="imageUploader" // Typesafe btw
onClientUploadComplete={(response) => ...}
onUploadError={(error) => ...}
/>
I asked for a better S3 for years. UploadThing exists because we got tired of waiting.
![](/_next/image?url=https%3A%2F%2Futfs.io%2Fa%2F7edrfbh9rv%2Fe404afdf-3aff-4252-91cf-981af73667d3-c3ubzq.5.jpg&w=3840&q=75)