Skip to content

Commit c13a63d

Browse files
committed
file uploader S3 completed & ready to deploy
0 parents  commit c13a63d

File tree

8 files changed

+887
-0
lines changed

8 files changed

+887
-0
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# dependencies
2+
/node_modules
3+
4+
# misc
5+
.DS_Store
6+
.env

app.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const express = require('express');
2+
const cors = require('cors');
3+
const expressFileUpload = require('express-fileupload');
4+
require('dotenv/config');
5+
6+
const app = express();
7+
8+
// Middlewares
9+
app.use(cors());
10+
app.use(express.json());
11+
app.use(expressFileUpload());
12+
13+
app.use('/file', require('./routes/fileUploadRoute'))
14+
15+
app.get('/', (req, res) => {
16+
res.status(200).json({
17+
msg: 'Welcome to File-Upload-S3, use this route for file Upload - /file/file-upload'
18+
});
19+
});
20+
21+
module.exports = app;

controllers/S3Setup.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const AWS = require('aws-sdk');
2+
3+
4+
AWS.config.update({
5+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
6+
secretAccessKey: process.env.AWS_SECRET_KEY,
7+
region: process.env.AWS_REGION
8+
});
9+
10+
const S3 = new AWS.S3({ apiVersion: '2006-03-01' });
11+
12+
module.exports = { S3 };

controllers/fileUploadController.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
const { S3 } = require('./S3Setup');
2+
3+
/**
4+
* File Upload into S3 Bucket
5+
* @param {object} req - Request
6+
* @param {object} res - Responce
7+
*/
8+
const fileUpload = async (req, res) => {
9+
if (req.files) {
10+
//File Upload to S3
11+
const file = req.files.file;
12+
13+
let dirName = getDirName(req.body.upload_type);
14+
var uploadParams = {
15+
Bucket: process.env.AWS_BUCKET_NAME,
16+
Key: dirName + file.name,
17+
ContentType: file.mimetype,
18+
ACL: 'public-read',
19+
Body: file.data,
20+
};
21+
22+
const uploadRes = await new Promise((resolve, reject) => {
23+
S3.upload(uploadParams, (err, data) => {
24+
if (err) {
25+
reject(err);
26+
} if (data) {
27+
resolve(data)
28+
}
29+
})
30+
});
31+
32+
//Send response to front-end
33+
res.status(200).json({
34+
msg: 'File Uploaded',
35+
data: {
36+
upload_type: req.body.upload_type
37+
},
38+
file: {
39+
file_link: uploadRes.Location,
40+
file_key: uploadRes.key,
41+
}
42+
})
43+
} else {
44+
res.status(422).json({
45+
msg: 'File is missing, please choose a file first'
46+
})
47+
}
48+
}
49+
50+
/**
51+
* Return S3 Bucket's Directory Name based on the file upload type
52+
* @param {string} upload_type
53+
* @returns S3 Bucket's Directory Name
54+
*/
55+
const getDirName = (upload_type) => {
56+
let dirName;
57+
switch (upload_type) {
58+
case 'file':
59+
dirName = 'dashboard-files/';
60+
break;
61+
62+
case 'profile':
63+
dirName = 'user-profile/'
64+
break;
65+
66+
case 'company_logo':
67+
dirName = 'company-logo/'
68+
break;
69+
70+
case 'company_video':
71+
dirName = 'company-promo-video/'
72+
break;
73+
74+
case 'meeting_logo':
75+
dirName = 'meeting-logo/'
76+
break;
77+
78+
case 'meeting_video':
79+
dirName = 'meeting-promo-video/'
80+
break;
81+
82+
default:
83+
dirName = 'dashboard-files/';
84+
}
85+
return dirName;
86+
}
87+
88+
module.exports = { fileUpload };

0 commit comments

Comments
 (0)