uppy/examples/aws-nodejs
Prakash af1ce527f5
implement minimal aws-s3 plugin (#6151)
Working :

- Simple uploads (putObject)
- Multipart uploads
- Pause / Resume / Abort , Resume works using listParts as before
- Progress tracking per chunk ( `#onProgress` ) - this is temporary ,
until we implement xhr based progress tracking as - before.

**added new examples to examples/aws-nodejs to test the rewrite , old
examples will eventually be removed**

Not Yet Implemented

- Rate limiting  – Currently uploads are sequential
- Retries
- Remote file uploads – Files from Google Drive, Dropbox, etc.
XHR progress
- full wiring with uppy state ( I saw few state bugs while testing it
manually )

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Murderlon <merlijn@soverin.net>
2026-06-17 13:54:47 +05:30
..
public implement minimal aws-s3 plugin (#6151) 2026-06-17 13:54:47 +05:30
index.js implement minimal aws-s3 plugin (#6151) 2026-06-17 13:54:47 +05:30
package.json build(deps): bump body-parser from 1.20.3 to 1.20.4 (#6070) 2025-12-02 09:55:11 +01:00
README.md Release: uppy@4.0.0-beta.11 (#5243) 2024-06-13 11:22:50 +00:00

Uppy + AWS S3 with Node.JS

A simple and fully working example of Uppy and AWS S3 storage with Node.js (and Express.js). It uses presigned URL at the backend level.

AWS Configuration

It's assumed that you are familiar with AWS, at least, with the storage service (S3) and users & policies (IAM).

These instructions are not fit for production, tightening the security is out of the scope here.

S3 Setup

Assuming youre trying to setup the user MY-UPPY-USER to put the uploaded files to the bucket MY-UPPY-BUCKET, heres how you can allow MY-UPPY-USER to get STS Federated Token and upload files to MY-UPPY-BUCKET:

  1. Set CORS settings on MY-UPPY-BUCKET bucket:

    [
      {
        "AllowedHeaders": ["*"],
        "AllowedMethods": ["GET", "PUT", "HEAD", "POST", "DELETE"],
        "AllowedOrigins": ["*"],
        "ExposeHeaders": ["ETag", "Location"]
      }
    ]
    
  2. Add the following Policy to MY-UPPY-BUCKET:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "MyMultipartPolicyStatement1",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::*:user/MY-UPPY-USER"
          },
          "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload"
          ],
          "Resource": "arn:aws:s3:::MY-UPPY-BUCKET/*"
        }
      ]
    }
    
  3. Add the following Policy to MY-UPPY-USER: (if you dont want to enable signing on the client, you can skip this step)

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "MyStsPolicyStatement1",
          "Effect": "Allow",
          "Action": ["sts:GetFederationToken"],
          "Resource": ["arn:aws:sts::*:federated-user/*"]
        }
      ]
    }
    

AWS Credentials

You may use existing AWS credentials or create a new user in the IAM page.

Prerequisites

Download this code or clone repository into a folder and install dependencies:

CYPRESS_INSTALL_BINARY=0 corepack yarn install

Add a .env file to the root directory and define the S3 bucket name and port variables like the example below:

COMPANION_AWS_BUCKET=MY-UPPY-BUCKET
COMPANION_AWS_REGION=…
COMPANION_AWS_KEY=…
COMPANION_AWS_SECRET=…
PORT=8080

N.B.: This example uses COMPANION_AWS_ environnement variables to facilitate integrations with other examples in this repository, but this example does not uses Companion at all.

Enjoy it

Start the application:

corepack yarn workspace @uppy-example/aws-nodejs start

Dashboard demo should now be available at http://localhost:8080.

Feel free to check how the demo works and feel free to open an issue.