2020. 11. 28. 15:43ใ๐ฑ Develop/Server
๐ 1. ํจํค์ง ์ค์น ๋ฐ S3 ์ ๋ณด์ ๋ ฅ
ํ์ํ ํจํค์ง๋ค์ ์ค์นํด์ค๋๋ค. ์ด๋ฏธ์ง ์ ๋ก๋๋ฅผ ์ํ multer,multer-s3๊ณผ aws-sdk๋ฅผ ์ค์นํด์ฃผ์ธ์.
npm install multer
npm install multer-s3
npm install aws-sdk ๐ s3,ec2 ๋ฑ ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌํ๊ฒ ์์ฑํ ์ ์์.
์ค์นํ๋ค๋ฉด ๐ config ํด๋์ js ํ์ผ ํ๋๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์!
s3 ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๋ฒํท์ ์์ฑํ ๋ csv๋ก ์ ์ฅํ๋ ํ์ผ์์ KeyID์ SecretKey, ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์ ์ ์
๋ ฅํฉ๋๋ค. ์ ๋ ๋ฆฌ์ ์ ์์ธ๋ก ๋ง๋ค์ด์, ap-northeast-2๋ก ์
๋ ฅํ์ต๋๋ค.
์ด ํค๋ค์ ๊ทธ๋๋ก github์ ์ฌ๋ ธ ์ ์์๋ ํดํน์ผ๋ก ๊ณผ๊ธ์ด ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ .gitignore ํ์ผ์ ์ถ๊ฐํด์ฃผ๊ณ .env๋ก ๊ด๋ฆฌํด์ฃผ์ธ์!
const multer = require('multer');
const multerS3 = require('multer-s3');
const aws = require('aws-sdk');
require('dotenv').config();
const s3 = new aws.S3({
accessKeyId: process.env.S3_KEYID, ๐ keyID ์
๋ ฅ
secretAccessKey: process.env.S3_PRIVATE_KEY, ๐ ์ํฌ๋ฆฟ ํค ์
๋ ฅ
region: process.env.REGION, ๐ ๋ฒํท ์์ฑ ๋ฆฌ์ ์
๋ ฅ
});
multer์์ ๊ฐ key์ ๋ํ ์์ฑ ๊ฐ์ ์ ๋ ฅํด์ค๋๋ค. ๋ค๋ฅธ ์กฐ๊ฑด๋ ์ฃผ๊ณ ์ถ๋ค๋ฉด, ๐ npm ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋๋๋ค!
let upload = multer({
storage: multerS3({
s3: s3,
bucket: process.env.BUCKET_NAME,
contentType: multerS3.AUTO_CONTENT_TYPE,
acl: 'public-read',
key: (req, file, cb) => {
cb(null, `${Date.now()}_${file.originalname}`);
},
}),
});
exports.upload = multer(upload);
๐ฉ 2. multer๋ก s3์ ์ด๋ฏธ์ง ์ ๋ก๋ํ๊ธฐ
๐ router / s3.js
multer์ ๋ฏธ๋ค์จ์ด์ด๊ธฐ ๋๋ฌธ์ router ๋ด์์ ์ถ๊ฐ๋ฅผ ํด์ค๋๋ค.
์ ๋ Controller-Service-Model ๊ตฌ์กฐ๋ก ํด๋๋ง์ ํด์, Controller์์ ์ด๋ฏธ์ง๋ฅผ ๋ฑ๋กํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ช
์ํด์ฃผ์์ต๋๋ค.
์๊น config/s3.js์์ ์ค์ ํ๋ upload๋ฅผ ๊ฐ์ ธ์์ ํ๋์ ์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค.
์ด๋ฏธ์ง๋ฅผ req์์ ๋ฐ์์ฌ ๋๋ req.file๋ก ๋ฐ์์ค๋๋ฐ, ์ด๋ controller์์ ์ค๋ช
ํ ๊ฒ์ใฐ๏ธ
var express = require('express');
var router = express.Router();
const ticketController = require('../controller/ticket');
const { upload } = require('../config/s3');
router.post('/upload', upload.single('ticketImg' ๐ ํ์ผ๋ช
), ticketController.registerTicket);
module.exports = router;
๋ ๋ง์ ์ด๋ฏธ์ง๋ฅผ ํ๊บผ๋ฒ์ ์ ๋ก๋ํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
upload.array('ํ์ผ๋ช ', ์ต๋ ํ์ผ ๊ฐ์) -> req.files
upload.field('[{ name : 'ํ์ผ๋ช ' }, { name : 'ํ์ผ๋ช ' }, { name : 'ํ์ผ๋ช ' } .....]')
๐ Controller / register.js
์ปจํธ๋กค๋ฌ์์๋ req.file๋ก ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ฐ์๋ด
๋๋ค.
.location์ ํ๋ฉด s3 ๊ฒฝ๋ก๊ฐ ๋์ค๋๋ฐ, ์ด ๊ฒฝ๋ก๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ฌ์ง ์ ๋ณด๋ฅผ ์ฃผ์ด ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
exports.register = async (req, res, next) => {
const Img = req.file;
console.log('s3 ์ด๋ฏธ์ง ๊ฒฝ๋ก :',Img.location);
};
๐โโ๏ธ postman์์ file์ ์ ์กํ๋ ค๋ฉด body์ form-data๋ฅผ ์ ํํด์ผํฉ๋๋ค.
์๊น ์ง์ ํ๋ ๐ํ์ผ๋ช
์ธ 'ticketImg'๋ฅผ key๋ก ๋ฃ๊ณ , ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ value์ ๋ฃ์ ๋ค send๋ฅผ ๋๋ฅด๋ฉดใฐ๏ธใฐ๏ธ
s3 ๊ฒฝ๋ก๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋งํฌ๋ฅผ ๋ฐ๋ผ์ ๋ค์ด๊ฐ๋ณด๋ฉด ์ด๋์๋ ์ฌ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๐ S3 ํด๋ ๋ณ๋ก ์ ๋ก๋ํ๋ ๋ฒโ
s3์์ 'ํด๋ ๋ง๋ค๊ธฐ'๋ก ํด๋ ํ๋๋ฅผ ์์ฑํด์ค๋๋ค. ์ ๋ ticket์ด๋ผ๋ ํด๋๋ฅผ ๋ง๋ค์ด๋์์ต๋๋ค.
์์์ ๐ config/ s3.js ์ฝ๋์ ํ๋๋ง ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค!${Date.now()}_${file.originalname}
์์ ์์ ํด๋ ์ด๋ฆ/ ๋ง ์ถ๊ฐํด์ฃผ์ธ์.
๊ทธ๋ฌ๋ฉด s3 ํด๋ ์์ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋ฉ๋๋ค.