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