: 데이터 저장 공간
npx yarn add @aws-sdk/client-s3 multer-s3 @aws-sdk/lib-storage
dotenv.config();
const s3 = new S3Client({ // S3Client 객체를 생성하고 S3에 접근하는데 사용
region: process.env.REGION,
credentials: {
accessKeyId: process.env.ACCESS_KEY,
secretAccessKey: process.env.SECRET_ACCESS_KEY,
},
})
const multerUpload = multer({
dest: tmpdir() // tmpdir() : 운영 체제의 임시 디렉토리 경로 반환
})
사용된 코드외에
multer.diskStorage({ destination : ...)} // 파일 저장 방식 정의
multer({ limits: { fileSize: 1 * 1024 * 1024 } }) // 파일 크기 제한 설정
fileFilter = (req, res, cb) => { ... } const multerUpload = multer({fileFilter}) // 파일 형식 필터링
등이 있다고 한다.
4. 설정 파일 기반으로 미들웨어 작성
const upload = async (req, res, next) => {
multerUpload.single('image')(req, res, async (error) => {
if (error) {
return res.status(500).json({ message: error.message })
}
if (req.file) {
const fileStream = fs.createReadStream(req.file.path) // 파일의 성공적인 처리시, 파일을 읽는 스트림 생성
const uploader = new Upload({ // 파일을 S3에 업로드
client: s3,
params: {
Bucket: process.env.BUCKET_NAME,
Key: req.file.originalname,
Body: fileStream,
ContentType: req.file.mimetype,
}
})
try {
await uploader.done()
next()
} catch (error) {
return res.status(500).json({ message: error.message })
}
} else {
next()
}
})
}
.array(fieldname, maxCount) : 여러 파일 업로드
ex) multerUpload.array('images', 10) // 최대 10개 파일
.fields(fields) : 필드 이름을 다르게 해서 여러 파일 업로드
ex) multerUpload.fields([{ name : 'image1' } , { name : 'image2' }])
등이 있다고 한다.
import { S3Client } from "@aws-sdk/client-s3"
import { Upload } from "@aws-sdk/lib-storage"
import multer from "multer"
import { tmpdir } from "os"
import dotenv from "dotenv"
import fs from "fs"
dotenv.config();
const s3 = new S3Client({ // S3Client 객체를 생성하고 S3에 접근하는데 사용
region: process.env.REGION,
credentials: {
accessKeyId: process.env.ACCESS_KEY,
secretAccessKey: process.env.SECRET_ACCESS_KEY,
},
})
// 멀터 미들웨어를 설정하고 파일을 디렉토리에 저장
const multerUpload = multer({
dest: tmpdir() // tmpdir() : 운영 체제의 임시 디렉토리 경로 반환
})
const upload = async (req, res, next) => {
multerUpload.single('image')(req, res, async (error) => {
if (error) {
return res.status(500).json({ message: error.message })
}
if (req.file) {
const fileStream = fs.createReadStream(req.file.path) // 파일의 성공적인 처리시, 파일을 읽는 스트림 생성
const uploader = new Upload({ // 파일을 S3에 업로드
client: s3,
params: {
Bucket: process.env.BUCKET_NAME,
Key: req.file.originalname,
Body: fileStream,
ContentType: req.file.mimetype,
}
})
try {
await uploader.done()
next()
} catch (error) {
return res.status(500).json({ message: error.message })
}
} else {
next()
}
})
}
export { upload }