Skip to content

Commit 054a47b

Browse files
committed
Multer – Nodejs Upload/Download Multiple Files/Images to Server MySQL/PostgreSQL database – Sequelize + Ajax
1 parent 47569d2 commit 054a47b

File tree

11 files changed

+1232
-0
lines changed

11 files changed

+1232
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const env = require('./env.js');
2+
3+
const Sequelize = require('sequelize');
4+
const sequelize = new Sequelize(env.database, env.username, env.password, {
5+
host: env.host,
6+
dialect: env.dialect,
7+
operatorsAliases: false,
8+
9+
pool: {
10+
max: env.max,
11+
min: env.pool.min,
12+
acquire: env.pool.acquire,
13+
idle: env.pool.idle
14+
}
15+
});
16+
17+
const db = {};
18+
19+
db.Sequelize = Sequelize;
20+
db.sequelize = sequelize;
21+
22+
db.files = require('../models/file.model.js')(sequelize, Sequelize);
23+
24+
module.exports = db;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const env = {
2+
database: 'loizenaidb',
3+
username: 'root',
4+
password: '12345',
5+
host: 'localhost',
6+
dialect: 'mysql',
7+
pool: {
8+
max: 5,
9+
min: 0,
10+
acquire: 30000,
11+
idle: 10000
12+
}
13+
};
14+
15+
module.exports = env;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const multer = require('multer');
2+
3+
var storage = multer.memoryStorage()
4+
var upload = multer({storage: storage});
5+
6+
module.exports = upload;
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
var stream = require('stream');
2+
var await = require('await')
3+
4+
const db = require('../config/db.config.js');
5+
const File = db.files;
6+
7+
8+
exports.uploadFile = (req, res) => {
9+
File.create({
10+
type: req.file.mimetype,
11+
name: req.file.originalname,
12+
data: req.file.buffer
13+
}).then(file => {
14+
console.log(file);
15+
16+
const result = {
17+
status: "ok",
18+
filename: req.file.originalname,
19+
message: "Upload Successfully!",
20+
downloadUrl: "http://localhost:8080/api/file/" + file.dataValues.id,
21+
}
22+
23+
res.json(result);
24+
}).catch(err => {
25+
console.log(err);
26+
27+
const result = {
28+
status: "error",
29+
error: err
30+
}
31+
res.json(result);
32+
});
33+
}
34+
35+
exports.uploadMultipleFiles = async (req, res) => {
36+
const messages = [];
37+
38+
for (const file of req.files) {
39+
const uploadfile = await File.create({
40+
type: file.mimetype,
41+
name: file.originalname,
42+
data: file.buffer
43+
});
44+
45+
// It will now wait for above Promise to be fulfilled and show the proper details
46+
console.log(uploadfile);
47+
48+
if (!uploadfile){
49+
const result = {
50+
status: "fail",
51+
filename: file.originalname,
52+
message: "Can NOT upload Successfully",
53+
}
54+
55+
messages.push(result);
56+
} else {
57+
const result = {
58+
status: "ok",
59+
filename: file.originalname,
60+
message: "Upload Successfully!",
61+
downloadUrl: "http://localhost:8080/api/file/" + uploadfile.dataValues.id,
62+
}
63+
64+
messages.push(result);
65+
}
66+
}
67+
68+
return res.json(messages);
69+
}
70+
71+
exports.listAllFiles = (req, res) => {
72+
File.findAll({attributes: ['id', 'name']}).then(files => {
73+
74+
const fileInfo = [];
75+
76+
console.log(files);
77+
78+
for(let i=0; i<files.length; i++){
79+
fileInfo.push({
80+
filename: files[i].name,
81+
url: "http://localhost:8080/api/file/" + files[i].dataValues.id
82+
})
83+
}
84+
85+
res.json(fileInfo);
86+
}).catch(err => {
87+
console.log(err);
88+
res.json({msg: 'Error', detail: err});
89+
});
90+
}
91+
92+
exports.downloadFile = (req, res) => {
93+
File.findByPk(req.params.id).then(file => {
94+
var fileContents = Buffer.from(file.data, "base64");
95+
var readStream = new stream.PassThrough();
96+
readStream.end(fileContents);
97+
98+
res.set('Content-disposition', 'attachment; filename=' + file.name);
99+
res.set('Content-Type', file.type);
100+
101+
readStream.pipe(res);
102+
}).catch(err => {
103+
console.log(err);
104+
res.json({msg: 'Error', detail: err});
105+
});
106+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = (sequelize, Sequelize) => {
2+
const File = sequelize.define('file', {
3+
type: {
4+
type: Sequelize.STRING
5+
},
6+
name: {
7+
type: Sequelize.STRING
8+
},
9+
data: {
10+
type: Sequelize.BLOB('long')
11+
}
12+
});
13+
14+
return File;
15+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
let express = require('express');
2+
let router = express.Router();
3+
let upload = require('../config/multer.config.js');
4+
5+
const fileWorker = require('../controllers/file.controller.js');
6+
7+
let path = __basedir + '/views/';
8+
9+
router.get('/', (req,res) => {
10+
res.sendFile(path + "index.html");
11+
});
12+
13+
router.post('/api/file/upload', upload.single("file"), fileWorker.uploadFile);
14+
router.post('/api/file/multiple/upload', upload.array('files', 4), fileWorker.uploadMultipleFiles);
15+
16+
router.get('/api/file/info', fileWorker.listAllFiles);
17+
18+
router.get('/api/file/:id', fileWorker.downloadFile);
19+
20+
module.exports = router;

0 commit comments

Comments
 (0)