참고 자료 : https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-multer-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4
upload.single('image')
{
fieldname: 'img',
originalname: 'hello.png',
encoding: '7bit',
mimetype: 'image/png',
destination: 'uploads/',
filename: 'hello1567238581123.png',
path: 'uploads//hello1567238581123.png',
size: 44933
}
upload.array('image', 10)
upload.fields([{ name: 'image1', limits: 5 }, { name: 'image2' }, { name: 'video' }])
console.log("req.files:", req.files);
console.log("file:", file);
하면 파일을 검사해 볼 수 있다.
console.log(file) 결과
{
fieldname: 'video',
originalname: 'better.mp4',
encoding: '7bit',
mimetype: 'video/mp4'
}
이런 식으로 미들웨어 내에서 file.fielname 별로 구분하여 다른 처리를 할 수 있다.
const aws = require("aws-sdk");
const multer = require("multer");
const multerS3 = require("multer-s3");
const path = require("path");
const moment = require("moment");
const s3 = new aws.S3({
region: process.env.AWS_REGION,
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_KEY,
});
const allowedExtensions = [".png", ".jpg", ".jpeg", ".bmp", ".gif"];
const uploadImage = multer({
storage: multerS3({
s3: s3,
bucket: process.env.AWS_BUCKET,
contentType: multerS3.AUTO_CONTENT_TYPE,
key: (req, file, callback) => {
const userId = req.verifiedToken.userInfo; //로그인한 유저만 업로드 가능하다고 했을 때 앞의 jwt미들웨어를 이미통과하여 받은 userId
// 확장자 검사
const extension = path.extname(file.originalname).toLowerCase();
if (!allowedExtensions.includes(extension)) {
return callback(new Error("확장자 에러"));
}
//s3 경로 설정 (버킷/userId_현재시간_랜덤넘버)
const now = moment().format("YYYY-MM-DD HH:mm:ss");
// 임의번호 생성
let randomNumber = "";
for (let i = 0; i < 8; i++) {
randomNumber += String(Math.floor(Math.random() * 10));
}
let s3Path = `image/${userId}_${now}_${randomNumber}`;
callback(null, s3Path);
},
acl: "public-read-write",
}),
// 이미지 당 용량 제한 (50MB)
limits: {
fileSize: 10485760, //52428800,
},
});