Example upload files using multer in nodejs, express js

Upload files using multer in nodejs. Ở bài trước tôi đã show một demo nho về bài viết upload files với formidable trong nodejs và express. Và hôm nay để tiếp tục giúp các bạn giải quyết về vấn đề upload file thì tôi sẽ demo cho các bạn một cách nữa đó là upload file với multer. Một trong những thư viện giúp handling multipart/form-data rất phổ biến. 

Nếu như bạn nào chưa đọc qua bài viết trước thì theo tôi nên quay lại bài "Upload files using formidable with nodejs". Để so sánh những ưu và nhược điểm của những thư viện hỗ trợ upload trong nodejs. Đừng bỏ qua những bài như thế, vì ở lập trình viên hơn nhau là chỗ tìm tòi và học được nhiều cách để áp dụng cho mỗi trường hợp. Upload files using formidable in nodejs 

Source code Upload file Mutler nodejs: Get Code On Github

Và bây giờ chúng ta sẽ đi qua một middleware rất phổ biến khác có tên là Multer để xử lý upload một hoặc nhiều files với Express và Node.js. Và thư mục chứa upload sẽ là một folder trong local chúng ta. Và bài sau tôi sẽ hướng dẫn các bạn kết hợp giữa Multer, Nodejs để upload lên cloudinary, một hosting rất ngon và mạnh mẽ trong việc storage file. Tất nhiên là có cnd và compress size miễn phí. Ok, và bây giờ chúng ta cũng nhau tìm hiểu thư viện Mutler. 

Multer là gì? What's Multer? 

Nói cho oai vậy thôi chứ thật ra như tiêu đề chúng ta đã nói rồi. Như tôi đã nói trước đó, Multer là một middleware giúp Express để xử lý các yêu cầu multipart/form-data.

Khi người dùng upload files lên server của chúng ta, trình duyệt sẽ tự động mã hóa yêu cầu dưới dạng kiểu multipart/form-data. Multer giúp dễ dàng xử lý một yêu cầu như vậy trên máy chủ. 

Cách sử dụng upload file với Multer trong nodejs

Cơ bản trên client là thế này 

Html

<form action="/uploadSingle" method="post" enctype="multipart/form-data">  
      <input type="file" name="name" />
</form>

 notes: đừng quên enctype là multipart/form-data. nếu không chúng ta sẽ không get được những field name khi submit xuống nodejs. 

Server nodejs 

Tôi sẽ viết một cấu trúc chuẩn của một api nodejs để cho các bạn mới sẽ dựa theo cấu trúc đó là phát triển thêm. Tôi đã chụp hình của cấu trúc một api nodejs mà tôi vừa tạo ra. 

Trong đó: folder api có 

- controller 
      + ControllerUpload 
- models 
     + ModelMulter 

Routes app index.js

Multer Single File Upload with Express and Node JS 

app.js 

const express = require('express');
const logger = require('morgan');

// Define port for app to listen on
const port =  process.env.PORT || 8080;

/* ==================================================== */
/* ===== Section 2: Configure express middlewares ===== */
/* ==================================================== */

const app =  express();

/* ==================================== */
/* ===== Section 3: Making Routes ===== */
/* ==================================== */

// set routes
require('./routes')(app) //importing route

//nếu dự án của bạn có nhiều người thì có thể set thêm
//require('./routes/user01')(app)

// To make the server live
app.listen(port, () => {
console.log(`App is live on port ${port}`);
});

Handling File Uploads

Routes/index.js 

File này là set routes nếu dự án của bạn có nhiều người tham gia

'use strict';
const ControllerUpload = require('../app/controllers/ControllerUpload');
//khai báo middleware multer ở đây
const uploadMulter = require('../app/models/ModelMulter')
module.exports = function(app) {
    //upload single ví dụ như avatar...
    app.route('/uploadSingle').post(uploadMulter.single('name'), ControllerUpload.uploadSingleFile);
    //upload nhiều files ví dụ như hình ảnh của sản phẩm
    app.route('/uploadMultiple').post(uploadMulter.any(), ControllerUpload.uploadMultipleFiles);
}

app/controllers/ControllerUpload.js

'use strict';
var self = module.exports = {
      uploadSingleFile: async(req, res) => {
          res.json(req.file)
      },
      uploadMultipleFiles: async(req, res) => {
          res.json(req.files)
      },

}

Multer Storage

app/models/ModelMulter.js

var multer = require('multer');
const path =require('path')
var storage = multer.diskStorage({
    destination: (req, file, cb) => {
        
        cb(null, './uploads/'); //hỉnh ảnh sẽ chưa trong folder uploads
       
    },
    filename: (req, file, cb) => {
        cb(null , file.originalname); ;// mặc định sẽ save name của hình ảnh
        // là name gốc, chúng ta có thể rename nó.  
    }
})

var upload = multer({storage:storage}); //save trên local của server khi dùng multer

module.exports = upload;

Như vậy tôi đã thiết lập xong một api đơn giản cho việc upload file using Multer trong nodejs Start node lên:

node app.js

Đây là kết quả tôi dùng postman.

Postman Upload single file Multer in nodejs

upload single file using multer in nodejs

Postman Upload Multiple file Multer in nodejs

Upload Multiple file Multer in nodejs

các bạn có thể lấy code trên github mà tôi đã up lên đó về và test luôn. Show img 

Source code Upload file Mutler nodejs: Get Code On Github

Đây là cách để upload file lên local dùng multer nhưng ở bài sau tôi sẽ hướng dẫn cho các bạn các upload lên hosting Cloudinary, sử dụng Multer một cách hoàn hảo. 

Nếu các bạn cảm thấy bài viết có ý nghĩa, vui lòng chia sẻ bài viết ra rộng rãi, để giúp mọi người hiểu thêm về upload file trong nodejs.
Cảm ơn các bạn đã đọc bài!!