파일을 업로드할 경로를 설정하고, 해당 경로에서 파일을 다운받을 수있어야 함.
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
반응형
'Nodejs > NestJS' 카테고리의 다른 글
[NestJS] Lifecycle global filter, pipes, exception 설정하기 08 (0) | 2024.05.27 |
---|---|
[NestJS] nest-winston 사용하기 07 (1) | 2024.05.27 |
[NestJS] fastify @UploadedFile, @UploadedFiles 커스텀 만들기 05 (0) | 2024.05.27 |
[NestJS] fastify middleware 추가하기(@fastify/multipart) 04 (0) | 2024.05.27 |
[NestJS] TypeORM(MySQL) 설정 Migration 포함 03 (0) | 2024.05.26 |