NodeMulter 이미지 업로드

yunji·2023년 7월 17일
0

node js

목록 보기
7/9
post-thumbnail

NodeMulter란

Multer는 파일 업로드를 위해 사용되는 multipart/form-data 를 다루기 위한 node.js 의 미들웨이다.

설치

$ npm install --save multer

Multer는 body 객체와 한 개의 file 혹은 여러개의 files 객체를 request 객체에 추가 하므로 사용자는 reqest에 접근하여 파일을 받아 올 수가 있다.

사용 방법.

Multer는 파일 혹은 사진이 하나 업로드 하는지 여려개 하는지에 따라 함수가 달라 진다.

const express = require('express')
const multer  = require('multer')
const upload = multer({ dest: 'uploads/' })

const app = express()

app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file 은 `avatar` 라는 필드의 파일 정보입니다.
  // 텍스트 필드가 있는 경우, req.body가 이를 포함할 것입니다.
})

app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
  // req.files 는 `photos` 라는 파일정보를 배열로 가지고 있습니다.
  // 텍스트 필드가 있는 경우, req.body가 이를 포함할 것입니다.
})

const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
  // req.files는 (String -> Array) 형태의 객체 입니다.
  // 필드명은 객체의 key에, 파일 정보는 배열로 value에 저장됩니다.
  //
  // e.g.
  //  req.files['avatar'][0] -> File
  //  req.files['gallery'] -> Array
  //
  // 텍스트 필드가 있는 경우, req.body가 이를 포함할 것입니다.
})

❓구현 기능❓

사용자가 사진을 한장 업로드하여 인증하는 계시 판을 만들려고 한다. 사용자 사진 업로드 api를 구현.

구현

📖 modules폴더의 upoad.js 파일

const multer = require("multer")
const { v4 } = require("uuid")//유일한 파일 이름을 정해 주기 우한 모듈

//img upload
const storage = multer.diskStorage({
    destination: (req, file, callback) => {
        callback(null, "img/") 
    },
    filename: (req, file, callback) => {
        callback(null, v4() + "." + file.mimetype.split("/")[1])
    }
})

const fileFilter = (req, file, callback) => {
    if (file.mimetype === "image/png" || file.mimetype === "image/jpg" || file.mimetype === "image/jpeg" || file.mimetype === "image/gif") { 
        callback(null, true) 
    } else {
        req.fileValidationError = "jpg, jpeg, png 파일만 업로드 가능합니다.";
        callback(null, false);
    }
}

const upload = multer({
    "storage": storage,
    "fileFilter": fileFilter,
    "limits": { 
        "fileSize": 30 * 1024 * 1024 
    }
})

module.exports = upload

multer에는 다양한 옵션이 있다. 그 중에서 저장공간과 관련된 storage와 파일 크기 및 예외처리를 위한 filefilter에 대하여만 작성 하였다.

📖 user_auth.js

router.post("/",upload.single('img'), async(req, res) => {

    // Request Data
    const imgValue =  req.file ? req.file.path : ""
    console.log(imgValue,"img path")

    const refreshTokenValue = req.headers.authorization
    const accessTokenValue = req.headers.authorization
    
    // Response Data
    const result = {
        "success": false,
        "message": null
    }

    try{
        if(imgValue === undefined || imgValue === null || imgValue === ""){
            throw new Error("이미지 값이 올바르지 않습니다.")
        }else{
       
            if(accessTokenValue !== undefined || refreshTokenValue !== undefined){ 

                const accountIndexValue = accessVerify(accessTokenValue).payload

                if(accessVerify(accessTokenValue).success === true){//treu일 경우-> access_token이 유효한 경우 
                    
                    if(refreshVerify(refreshTokenValue).message === "token expired"){
                        const temp = await updateRefreshToken(accountIndexValue)
                        res.send(temp)
                    }else{
                    
                        const connection = await db.getConnection()
                        const sql = `
                            INSERT INTO user_auth (account_index, img, date) VALUES(?, ?, ?) 
                        `
                        const values = [accountIndexValue, imgValue, nowTime()]
                        await connection.query(sql, values)

                        result.success = true
                        connection.release()
                        res.send(result)
                    }
                
                }else if(accessVerify(accessTokenValue).message === "token expired"){//access_token이 완료된 경우 
                    //refresh_token이 유효한 경우 
                    if(refreshVerify(refreshTokenValue)){//true 인 경우 -> refresh_token이 유효한 경우 새로운 access_token생성
                        const accountIndexValue = refreshVerify(refreshTokenValue).payload
                        const temp = await newAccessToken(accountIndexValue, refreshTokenValue)
                        res.send(temp)

                    }else{
                        throw new Error("모든 토큰이 완료 되었습니다.")
                    }

                }else{
                    throw new Error("토큰이 올바르지 않습니다.")
                }
            }else{
                throw new Error("토큰이 올바르지 않습니다.")
            }
        }
    }catch(e){
        result.message = e.message
        console.log("POST /user_auth API ERR : ", e.message)
    }

})

참고 문헌
https://github.com/expressjs/multer/blob/master/doc/README-ko.md

profile
웹 개발

0개의 댓글