Node.js RestAPIs Download File from Amazon S3 | using Express, AWS-SDK


In the tutorial, we show how to build a Node.js/Express RestAPIs to Download Files from Amazon S3 using AWS-SDK.

Previous post:
Node.js RestAPIs upload file to Amazon S3

Related posts:
Node.js/Express – PostgreSQL example – Upload File/Download File – Multer + Sequelize CRUD
NodeJS/Express – Bootstrap Image example
Mongoose Many-to-Many related models with NodeJS/Express, MongoDB

Related pages:


  • Node.js
  • Express
  • Amazon S3




We create a Node.js project as below ->


Expose a RestAPI: '/api/files/:filename'

File on Amazon S3 ->


Download File ->


Error ->



Setting up Node.js project

Create a folder NodejsDownloadFileAmazonS3, then init Node.js project ->

>npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (nodejsdownloadfileamazons3)
version: (1.0.0)
description: Nodejs Express RestAPIs downloads file from Amazon S3
entry point: (index.js) server.js
test command:
git repository:
keywords: Nodejs, Express, RestAPI, DownloadFile, Amazon S3, AWS-SDK
license: (ISC)
About to write to D:\gkz\article\NodejsDownloadFileAmazonS3\package.json:

  "name": "nodejsdownloadfileamazons3",
  "version": "1.0.0",
  "description": "Nodejs Express RestAPIs downloads file from Amazon S3",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  "keywords": [
  "author": "",
  "license": "ISC"

Is this ok? (yes) yes

Install Express, AWS-SDK ->

npm install express aws-sdk --save

-> package.json file:

  "name": "nodejsdownloadfileamazons3",
  "version": "1.0.0",
  "description": "Nodejs Express RestAPIs downloads file from Amazon S3",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  "keywords": [
  "author": "",
  "license": "ISC",
  "dependencies": {
    "aws-sdk": "^2.302.0",
    "express": "^4.16.3"
AWS S3 Config

– Create a file ./app/config/s3.env.js ->

const env = {
	AWS_ACCESS_KEY: 'AKIAIGGOGCH2UD7H63JA', // change to yours
	AWS_SECRET_ACCESS_KEY: 'GaGHmB7ajGsBOd6w626l6wilE+es3zqN9oT9C9Ka', // change to yours
	REGION : 'us-east-2', // change to yours
	Bucket: 'ozenero-s3-bucket' // change to yours
module.exports = env;

– Configure S3 Client in a file ./app/config/s3.config.js ->

const AWS = require('aws-sdk');
const env = require('./s3.env.js');
const s3Client = new AWS.S3({
    accessKeyId: env.AWS_ACCESS_KEY,
    secretAccessKey: env.AWS_SECRET_ACCESS_KEY,
	region : env.REGION
const downloadParams = {
         Bucket: env.Bucket, 
         Key: '', // pass key

const s3 = {};
s3.s3Client = s3Client;
s3.downloadParams = downloadParams;
module.exports = s3;
Express Router

– Create router in file ./app/routers/s3.router.js ->

let express = require('express');
let router = express.Router();
const awsWorker = require('../controllers/s3.controller.js');
router.get('/api/files/:filename', awsWorker.doDownload);
module.exports = router;
Download Controller

– Implement S3 Downloader in a controller file ./app/controllers/s3.controller.js ->

var stream = require('stream');
const s3 = require('../config/s3.config.js');
exports.doDownload = (req, res) => {
	const s3Client = s3.s3Client;
	const params = s3.downloadParams;
	params.Key = req.params.filename;

			.on('error', function(err){
				res.status(500).json({error:"Error -> " + err});

server.js file ->

const express = require('express');
const app = express();
let router = require('./app/routers/s3.router.js');
app.use('/', router);
// Create a Server
const server = app.listen(8080, function () {
  let host = server.address().address
  let port = server.address().port
  console.log("App listening at http://%s:%s", host, port); 


Use npm install to install all dependencies before run the Node.js server with cmd npm start.


One thought on “Node.js RestAPIs Download File from Amazon S3 | using Express, AWS-SDK”

  1. Please can you let me know how to find keys(folder names and length) from aws s3 bucket through node.js
    It will be really helpful. Hope you reply

    Thanks in advance

Leave a Reply

Your email address will not be published. Required fields are marked *