프로젝트 진행 시, 이미지를 S3에 업로드 한 후, URL을 클라이언트에게 다시 줘야하는 미션을 받았다.
Multer를 사용하여 S3에 저장 후, URL을 반환하는 코드를 작성하였다.
const { S3Client } = require('@aws-sdk/client-s3');
const multer = require('multer');
const multerS3 = require('multer-s3');
require('dotenv').config();
// S3 지역 및 인증 수단 변경
const s3 = new S3Client({
region: 'ap-northeast-2',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
const multerMiddleware = multer({
storage: multerS3({
s3: s3,
bucket: 'clonecodingimage',
acl: 'public-read', // read만 읽기 가능하도록 변경
contentType: multerS3.AUTO_CONTENT_TYPE, // 어떠한 데이터 타입도 가능
key: function (req, file, cb) {
cb(null, `images/${Date.now().toString()}`); // 파일위치와 파일명을 지정해주는 코드, 시간 순으로 저장을 함
},
}),
limits: { fileSize: 5 * 1024 * 1024 }, // 5메가로 용량 제한
});
module.exports = multerMiddleware;
// controller/article.controller.js
createContentImage = async (req, res, next) => {
try {
const url = req.file.location;
res.status(200).json({ url });
} catch (error) {
next(error);
}
};
// routes/article.route.js
// Article 작성 시 image 추가
router.post(
'/contentImage',
authMiddleware,
multerMiddleware.single('contentImage'),
articleController.createContentImage
);