├── .gitignore ├── resources └── static │ └── assets │ └── uploads │ ├── bezkoder.doc │ ├── bezkoder.jpg │ └── bezkoder.png ├── src ├── routes │ └── index.js ├── middleware │ └── upload.js └── controller │ └── file.controller.js ├── server.js ├── package.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /resources/static/assets/uploads/bezkoder.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bezkoder/node-js-express-download-file/HEAD/resources/static/assets/uploads/bezkoder.doc -------------------------------------------------------------------------------- /resources/static/assets/uploads/bezkoder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bezkoder/node-js-express-download-file/HEAD/resources/static/assets/uploads/bezkoder.jpg -------------------------------------------------------------------------------- /resources/static/assets/uploads/bezkoder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bezkoder/node-js-express-download-file/HEAD/resources/static/assets/uploads/bezkoder.png -------------------------------------------------------------------------------- /src/routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const controller = require("../controller/file.controller"); 4 | 5 | let routes = (app) => { 6 | router.post("/upload", controller.upload); 7 | router.get("/files", controller.getListFiles); 8 | router.get("/files/:name", controller.download); 9 | 10 | app.use(router); 11 | }; 12 | 13 | module.exports = routes; 14 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const cors = require("cors"); 2 | const express = require("express"); 3 | const app = express(); 4 | 5 | global.__basedir = __dirname; 6 | 7 | var corsOptions = { 8 | origin: "http://localhost:8081" 9 | }; 10 | 11 | app.use(cors(corsOptions)); 12 | 13 | const initRoutes = require("./src/routes"); 14 | 15 | app.use(express.urlencoded({ extended: true })); 16 | initRoutes(app); 17 | 18 | let port = 8080; 19 | app.listen(port, () => { 20 | console.log(`Running at localhost:${port}`); 21 | }); 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-js-express-download-files", 3 | "version": "1.0.0", 4 | "description": "Node.js Express Download File Rest APis", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "node js", 11 | "upload", 12 | "download", 13 | "file", 14 | "multipart", 15 | "rest api", 16 | "express", 17 | "multer" 18 | ], 19 | "author": "bezkoder", 20 | "license": "ISC", 21 | "dependencies": { 22 | "cors": "^2.8.5", 23 | "express": "^4.17.1", 24 | "multer": "^1.4.2" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/middleware/upload.js: -------------------------------------------------------------------------------- 1 | const util = require("util"); 2 | const multer = require("multer"); 3 | const maxSize = 2 * 1024 * 1024; 4 | 5 | let storage = multer.diskStorage({ 6 | destination: (req, file, cb) => { 7 | cb(null, __basedir + "/resources/static/assets/uploads/"); 8 | }, 9 | filename: (req, file, cb) => { 10 | console.log(file.originalname); 11 | cb(null, file.originalname); 12 | }, 13 | }); 14 | 15 | let uploadFile = multer({ 16 | storage: storage, 17 | limits: { fileSize: maxSize }, 18 | }).single("file"); 19 | 20 | let uploadFileMiddleware = util.promisify(uploadFile); 21 | module.exports = uploadFileMiddleware; 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Node.js Express Upload/Download file Rest API 2 | 3 | For more detail, please visit: 4 | > [Node.js Download File example with Express Rest API](https://bezkoder.com/node-js-express-download-file/) 5 | 6 | > [Node.js Express File Upload Rest API example](https://bezkoder.com/node-js-express-file-upload/) 7 | 8 | Front-end Apps to work with this Node.js Server: 9 | - [Angular 8 Client](https://bezkoder.com/angular-spring-boot-file-upload/) / [Angular 10 Client](https://bezkoder.com/angular-10-file-upload/) 10 | - [Vue Client](https://bezkoder.com/vue-axios-file-upload/) / [Vuetify Client](https://bezkoder.com/vuetify-file-upload/) 11 | - [React Client](https://bezkoder.com/react-file-upload-spring-boot/) / [React Hooks Client](https://bezkoder.com/react-hooks-file-upload/) 12 | 13 | More tutorials: 14 | > [Node.js: Upload/Import Excel file data into Database](https://bezkoder.com/node-js-upload-excel-file-database/) 15 | 16 | > [Build Node.js Rest APIs with Express, Sequelize & MySQL](https://bezkoder.com/node-js-express-sequelize-mysql/) 17 | 18 | ## Project setup 19 | ``` 20 | npm install 21 | ``` 22 | 23 | ### Run 24 | ``` 25 | node server.js 26 | ``` 27 | -------------------------------------------------------------------------------- /src/controller/file.controller.js: -------------------------------------------------------------------------------- 1 | const uploadFile = require("../middleware/upload"); 2 | const fs = require("fs"); 3 | const baseUrl = "http://localhost:8080/files/"; 4 | 5 | const upload = async (req, res) => { 6 | try { 7 | await uploadFile(req, res); 8 | 9 | if (req.file == undefined) { 10 | return res.status(400).send({ message: "Please upload a file!" }); 11 | } 12 | 13 | res.status(200).send({ 14 | message: "Uploaded the file successfully: " + req.file.originalname, 15 | }); 16 | } catch (err) { 17 | console.log(err); 18 | 19 | if (err.code == "LIMIT_FILE_SIZE") { 20 | return res.status(500).send({ 21 | message: "File size cannot be larger than 2MB!", 22 | }); 23 | } 24 | 25 | res.status(500).send({ 26 | message: `Could not upload the file: ${req.file.originalname}. ${err}`, 27 | }); 28 | } 29 | }; 30 | 31 | const getListFiles = (req, res) => { 32 | const directoryPath = __basedir + "/resources/static/assets/uploads/"; 33 | 34 | fs.readdir(directoryPath, function (err, files) { 35 | if (err) { 36 | res.status(500).send({ 37 | message: "Unable to scan files!", 38 | }); 39 | } 40 | 41 | let fileInfos = []; 42 | 43 | files.forEach((file) => { 44 | fileInfos.push({ 45 | name: file, 46 | url: baseUrl + file, 47 | }); 48 | }); 49 | 50 | res.status(200).send(fileInfos); 51 | }); 52 | }; 53 | 54 | const download = (req, res) => { 55 | const fileName = req.params.name; 56 | const directoryPath = __basedir + "/resources/static/assets/uploads/"; 57 | 58 | res.download(directoryPath + fileName, fileName, (err) => { 59 | if (err) { 60 | res.status(500).send({ 61 | message: "Could not download the file. " + err, 62 | }); 63 | } 64 | }); 65 | }; 66 | 67 | module.exports = { 68 | upload, 69 | getListFiles, 70 | download, 71 | }; 72 | --------------------------------------------------------------------------------