본문 바로가기

Nodejs/NestJS

[NestJS] 파일 업로드 처리 로컬 & AWS S3 06

파일을 업로드할 경로를 설정하고, 해당 경로에서 파일을 다운받을 수있어야 함.

 

2가지 방식을 살펴볼 텐데

1. local의 public에서 처리하는 방법 (@fastify/static)

2. s3에 업로드 하는 방법(@aws-sdk/client-s3)

 

1. local에 업로드하는 방법은 아래와 같다.

 

import * as fs from "fs";
import { join } from "path";
    const path = join(process.cwd(), "public", "assets", "images", profile.filename);
    fs.writeFileSync(path, profile.value);

업로드할 경로 설정하고 writeFileSync 하면 끝

** 필요하다면 .env네 config로 빼도 좋음.

2. local에서 다운로드 하기

경로를 public/assets/images로 잡아줬으니 외부에서 해당 경로로 접근할 수 있도록 열어줘야 함.

yarn add @fastify/static


["/public/assets"].forEach((prefix) => app.useStaticAssets({ root: join(process.cwd(), prefix), prefix }));

 

3. AWS S3에 업로드

aws-sdk/client-s3 추가

yarn add @aws-sdk/client-s3 @aws-sdk/s3-request-presigner

aws.module.ts, aws.service.ts 추가하고 ConfigService 의존성 추가하고 init

import { S3Client } from "@aws-sdk/client-s3";
@Injectable()
export class AwsService {
  s3Client: S3Client;
  Bucket: string;
  constructor(private configService: ConfigService) {
    // AWS S3 클라이언트 초기화. 환경 설정 정보를 사용하여 AWS 리전, Access Key, Secret Key를 설정.
    this.s3Client = new S3Client({
      region: this.configService.get("AWS_DEFAULT_REGION"), // AWS Region
      credentials: {
        accessKeyId: this.configService.get("AWS_ACCESS_KEY_ID"), // Access Key
        secretAccessKey: this.configService.get("AWS_SECRET_ACCESS_KEY"), // Secret Key
      },
    });
    this.Bucket = this.configService.get("AWS_BUCKET");
  }
}

업로드처리 단일/다중

import { GetObjectCommand, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
  putOubject(file: FastifyFile) {
    const temp = "temp/";
    const command = new PutObjectCommand({ Bucket: this.Bucket, Key: temp + file.filename, Body: file.value });
    return this.s3Client.send(command);
  }
  putOubjects(files: FastifyFile[]) {
    if (files == undefined || files.length == 0) {
      throw new BadRequestException();
    }
    const temp = "temp/";
    return Promise.all(
      files
        .map((file) => ({ Bucket: this.Bucket, Key: temp + file.filename, Body: file.value }))
        .map((params) => this.s3Client.send(new PutObjectCommand(params)))
    );
  }

 

4. AWS S3 Signed 링크 가져오는 방법

파일을 가져올 때, public으로 접근을 열어주지 않고 만료 링크를 만들어서 제공하는 방법

  getPresignedURL(Key: string) {
    return getSignedUrl(this.s3Client, new GetObjectCommand({ Bucket: this.Bucket, Key }), { expiresIn: 300 }); //60*5
  }

expiresIn을 설정해서 만료 기간을 설정할 수 있음.(분단위 이고 최대 7일까지 설정 가능)

 

현재까지 코드 보기: https://github.com/close852/nestjs-toy/tree/06

 

 

 

반응형