[NestJS] AWS S3 업로드/다운로드/삭제

Haeseo Lee·2023년 4월 7일
0

NestJS

목록 보기
4/4
post-thumbnail

업로드

메소드

  • upload() ↓리턴값 예시
{
  ETag: '(etag)',
  ServerSideEncryption: 'AES256',
  VersionId: '(versionid)',
  Location: '(버킷 내 리소스가 저장된 위치)',
  key: '(파일명)',
  Bucket: '(bucket)'
}
  • putObject() ↓리턴값 예시
{
  ETag: '(etag)',
  ServerSideEncryption: 'AES256',
  VersionId: '(versionid)'
}

파일 여러개 업로드

async uploadFiles(files: Express.Multer.File[]) {
        this.logger.debug('file recieve...');

        const params = {
            Bucket: process.env.AWS_S3_BUCKET_NAME,
            ACL: 'private',
            Key: '',
            Body: null,
        };

        try {
            await Promise.all(
                files.map(async (file: Express.Multer.File) => {
                    params.Key = file.originalname;
                    params.Body = file.buffer;

                    const upload = await this.s3.upload(params).promise();
                    console.log(upload);
                }),
            );
            this.logger.debug('upload file to s3');
        } catch (err) {
            this.logger.debug('upload failed');
            console.log(err);
        }
}

다운로드

사실 백엔드 서버쪽에서 파일을 다운로드 받을 일은 잘 없다. 보통은 프론트 쪽에서 unresigned url을 이용해서 s3에 바로 접근한다. 그래도 일단 정리해봤다.

메소드

getObject()

파일 여러개 다운로드

async downloadFiles(payload: any) {
        this.logger.debug('download request from client...');
        console.log(payload.files);

        const streams = [];
        const params = {
            Bucket: process.env.AWS_S3_BUCKET_NAME,
            Key: ''
        }

        try {
            await Promise.all(
                payload.files.map(async (file: string) => {
                    params.Key = file;
                    const stream = await this.s3.getObject(params).createReadStream();
                    streams.push(new StreamableFile(stream));
                }),
            );
            this.logger.debug('success to get files');
            return streams;
        } catch (err) {
            this.logger.debug('failed to get files');
            console.log(err);
        }
}

파일 삭제

메소드

deleteObject()

파일 1개 삭제

async deleteFile(payload: any) {
        this.logger.debug('delete request from client...');

        const params = {
            Bucket: process.env.AWS_S3_BUCKET_NAME,
            Key: payload.file
        }

        try {
            const result = await this.s3.deleteObject(params).promise();
            this.logger.debug('success to delete file');
            return { res_code: 201, message: '파일 삭제 성공' };
        } catch (err) {
            this.logger.debug('failed to delete file');
            console.log(err);
        }
    }
profile
잡생각 많은 인간

0개의 댓글