이미지 압축 및 s3 업로드는
정말 많이 쓰이지만 의외로 포스팅이 없어
간단히 정리해본다.
처리절차
1. 클라이언트 요청 (생략)
2. multer-s3로 aws 업로드
3. key로 s3 object를 불러와 압축 후 재 업로드
4. 기존 파일 key로 제거
1. 클라이언트 요청 (생략)
요청은 포스트맨(Postman)으로 요청,
테스트하면 됨으로 생략 (form-data 방식 활용)
2. multer-s3로 aws 업로드
express router에서 미들웨어 처리를 해줄것이다.
그전에 multer-s3 미들웨어를 만들어주자.
// aws.ts
const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
const aws_config = {
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_KEY,
region: 'ap-northeast-2',
signatureVersion: 'v4',
};
export const s3 = new AWS.S3();
export const uploadImage = multer({
storage: multerS3({
s3,
bucket: 'test.bucket',
metadata: (req, file, cb) => {
cb(null, { fieldName: file.fieldname });
},
key: (req, file, cb) => {
const ext = path.extname(file.originalname);
const timestamp = new Date().getTime().valueOf();
const filename = 'test' + timestamp + ext;
cb(null, filename);
},
}),
});
이제 사용자 요청을 받는 router부분에서
uploadImage를 미들웨어로 넣어주면 된다.
// image.router.ts
router.post('/image/upload', uploadImage.single('photo'), (req, res) => {
...
})
3. key로 s3 object를 불러와 압축 후 재 업로드 & 기존 파일 key로 제거
uploadImage 처리 후 req.file에서
업로드된 이미지 객체의 key를 확인할 수 있다.
이 key를 활용해 객체를 불러와
압축하여 재업로드 및 삭제를 진행할것이다.
// aws.ts
export const compressImageUploadByKey = async (key: string, width?: number) => {
try {
const compressedKey = `compressed_${key}`;
const config = {
Bucket: 'test.bucket',
Key: key
}
let resizedConfig: any = {
Bucket: 'test.bucket',
Key: compressedKey
}
// fetch
const imageData: any = await s3.getObject(config).promise();
// resizing
const imageBuffer = await sharp(imageData.Body).resize({ width: width || 640 }).toBuffer();
resizedConfig.Body = imageBuffer;
// upload
await s3.putObject(resizedConfig).promise();
// origin image delete
await s3.deleteObject(config).promise();
return compressedKey;
} catch(error) {
console.log('Get image by key from aws: ', error);
}
}
불러오고, 압축하고, 업로드하고, 지우고
4가지 작업이 진행되었다.
새로 업로드된 이미지의 Key를
DB에 저장하거나 하는 작업을
각 작업 환경에 맞게 진행하면 끝
'개발, 코딩 > Node' 카테고리의 다른 글
server.js 스크립트 클래스로 구조화 하기 (0) | 2021.12.17 |
---|---|
Node.js 무중단 서버 운영 (pm2) (0) | 2021.12.02 |
파일정리 라이브러리 공유 (0) | 2021.09.06 |
[Node js] 서버로부터 buffer 형식으로 파일 전송받아 처리하기 (0) | 2021.07.28 |
node.js - canvas (0) | 2021.03.31 |