Multer is a popular middleware for handling multipart/form-data
, which is primarily used for file uploads in Node.js applications. When working with Amazon S3 for file storage, you'll need to use the multer-s3
package as an extension to Multer. Below is a step-by-step guide on how to use Multer with Amazon S3 for file uploads in a Node.js application.
Install the necessary npm packages: multer
, multer-s3
, and aws-sdk
.
bashnpm install multer multer-s3 aws-sdk
Create an S3 bucket on Amazon AWS, and obtain your AWS access key, secret key, and bucket name.
Create a file, e.g., s3Config.js
, to configure the AWS SDK with your credentials:
javascript// s3Config.js
const aws = require('aws-sdk');
aws.config.update({
secretAccessKey: 'YOUR_SECRET_KEY',
accessKeyId: 'YOUR_ACCESS_KEY',
region: 'YOUR_AWS_REGION', // e.g., 'us-east-1'
});
const s3 = new aws.S3();
module.exports = s3;
Create a file, e.g., upload.js
, to set up Multer with Multer-S3:
javascript// upload.js
const multer = require('multer');
const multerS3 = require('multer-s3');
const s3 = require('./s3Config');
const upload = multer({
storage: multerS3({
s3: s3,
bucket: 'YOUR_S3_BUCKET_NAME',
acl: 'public-read', // Set ACL permissions as needed
key: function (req, file, cb) {
cb(null, Date.now().toString() + '-' + file.originalname);
},
}),
});
module.exports = upload;
In your route file, use the Multer middleware from the upload.js
file:
javascript// routes.js
const express = require('express');
const router = express.Router();
const upload = require('./upload');
router.post('/upload', upload.single('file'), (req, res) => {
res.json({ imageUrl: req.file.location });
});
module.exports = router;
Make sure to replace 'YOUR_S3_BUCKET_NAME'
, 'YOUR_SECRET_KEY'
, 'YOUR_ACCESS_KEY'
, and 'YOUR_AWS_REGION'
with your actual S3 bucket name, AWS credentials, and region.
In your main app file (e.g., app.js
), integrate the routes:
javascript// app.js
const express = require('express');
const app = express();
const routes = require('./routes');
app.use('/api', routes);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Now, when you make a POST request to /api/upload
with a file attached, Multer will handle the file upload to your S3 bucket. The URL of the uploaded file will be returned in the response.
Remember to handle security considerations, such as access control and validation of file types and sizes, according to your application requirements.