Sling Academy
Home/Node.js/Node.js: How to upload files and images to AWS S3

Node.js: How to upload files and images to AWS S3

Last updated: December 28, 2023

Introduction

Amazon Web Services (AWS) Simple Storage Service (S3) is a scalable object storage service that allows developers to store and retrieve various types of data. Integrating AWS S3 to a Node.js application can enhance storage capabilities and allow for the efficient management and deployment of user-generated content such as files and images. This tutorial will guide you through the process of setting up an AWS S3 bucket and configuring a Node.js application to upload files to it.

Prerequisites

  • Node.js installed on your machine
  • An AWS account with access to S3
  • AWS CLI configured (optional, but recommended)
  • Understanding of JavaScript and Node.js

Set Up AWS S3 Bucket

Before we begin, ensure you have created an AWS S3 bucket from your AWS Management Console. Make a note of your bucket name and the region it resides in, as you’ll need these details later. Also, you need to create an IAM user with programmatic access and the necessary permissions to write to your S3 bucket.

Initializing a Node.js Project

To start, initialize a new Node.js project by running:

npm init -y

Next, install the necessary packages:

npm install aws-sdk multer multer-s3

Configuring AWS SDK in Your Application

Configure the AWS SDK with your credentials. It is recommended to use environment variables for security purposes:

const AWS = require('aws-sdk');

AWS.config.update({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  region: process.env.AWS_REGION
});

Basic File Upload

The simplest way to upload a file to S3 using Node.js is by using the AWS SDK. Here is an example:

const s3 = new AWS.S3();

function uploadFile(file) {
  const params = {
    Bucket: process.env.AWS_BUCKET_NAME,
    Key: file.name,
    Body: file.data,
  };

  s3.upload(params, function(err, data) {
    if (err) {
      throw err;
    }
    console.log(`File uploaded successfully at ${data.Location}`);
  });
}

Advanced File Upload with Multer-S3

For handling multipart/form-data, which is primarily used for uploading files via forms, we use the multer middleware combined with multer-s3 for direct file uploads to AWS S3:

const multer = require('multer');
const multerS3 = require('multer-s3');

const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: process.env.AWS_BUCKET_NAME,
    metadata: function (req, file, cb) {
      cb(null, {fieldName: file.fieldname});
    },
    key: function (req, file, cb) {
      cb(null, Date.now().toString() + '-' + file.originalname);
    }
  })
});

Use the ‘upload’ middleware in your route handlers to process file uploads:

const express = require('express');
const app = express();

app.post('/upload', upload.single('file'), (req, res) => {
  res.send('File uploaded successfully.');
});

Error Handling and Best Practices

Always include error handling to manage exceptions that might occur during the file upload process. Additionally, implement security best practices such as input validation, setting appropriate file size limits, and avoiding sensitive data exposure.

Conclusion

In this tutorial, we explored the process of uploading files and images to AWS S3 using Node.js. Starting with configuring the AWS SDK and using simple methods to upload files, we progressed to using multer and multer-s3 for handling file uploads through API endpoints. By following this guide, you should now be able to integrate S3 uploads into your Node.js applications effectively and securely.

Remember to abide by security best practices, and keep your AWS credentials private. Happy coding!

Next Article: How to Run Multiple NPM Scripts Sequentially

Previous Article: Express.js vs Nest.js: Which is better to build backend APIs?

Series: The First Steps to Node.js

Node.js

You May Also Like

  • NestJS: How to create cursor-based pagination (2 examples)
  • Cursor-Based Pagination in SequelizeJS: Practical Examples
  • MongooseJS: Cursor-Based Pagination Examples
  • Node.js: How to get location from IP address (3 approaches)
  • SequelizeJS: How to reset auto-increment ID after deleting records
  • SequelizeJS: Grouping Results by Multiple Columns
  • NestJS: Using Faker.js to populate database (for testing)
  • NodeJS: Search and download images by keyword from Unsplash API
  • NestJS: Generate N random users using Faker.js
  • Sequelize Upsert: How to insert or update a record in one query
  • NodeJS: Declaring types when using dotenv with TypeScript
  • Using ExpressJS and Multer with TypeScript
  • NodeJS: Link to static assets (JS, CSS) in Pug templates
  • NodeJS: How to use mixins in Pug templates
  • NodeJS: Displaying images and links in Pug templates
  • ExpressJS + Pug: How to use loops to render array data
  • ExpressJS: Using MORGAN to Log HTTP Requests
  • NodeJS: Using express-fileupload to simply upload files
  • ExpressJS: How to render JSON in Pug templates