본문 바로가기

Nodejs/NestJS

[NestJS] fastify @UploadedFile, @UploadedFiles 커스텀 만들기 05

fastify에서는 Express.Multer.File를 사용할 수 없기 때문에(사용을 시도하면 할 수 있는데 파일명을 불러오는 필드값이 달라서 이름 필드가 안나왔었음. 해당문제만 해결하면 쓸 수 있을 수도?) 만들어서 사용합니다.

 

FastifyFile을 정의합니다.

src/types/fastify.file.ts

export type FastifyFile = {
  value: Buffer;
  filename: string;
  encoding: string;
  mimetype: string;
};

 

UploadedFile, UploadedFiles를 정의 합니다.

** 모든 옵션에 대응하기 위한 decorator라기 보다는 당장 편하게 쓸 목적, 개발하다가 발견되는 이슈사항은 추가 개발하면서 사용 예정

src/decorators/uploaded-file.decorator.ts

export * from "./uploaded-file.decorator";
export * from "./uploaded-files.decorator";


export const UploadedFile = createParamDecorator((data, ctx: ExecutionContext) => {
  const req: FastifyRequest = ctx.switchToHttp().getRequest();
  const result: any = req.body;
  const target: FastifyFile[] = result[data];
  if (target && !isArray(target)) return target;
  return undefined;
});

export const UploadedFiles = createParamDecorator((data, ctx: ExecutionContext) => {
  const req: FastifyRequest = ctx.switchToHttp().getRequest();
  const result: any = req.body;
  const target: FastifyFile[] = result[data];
  if (target) return target;
  return undefined;
});

 

사용법

사용자 정보를 입력받는데 profile, name, images를 입력받아야 하는 상황이 라면 아래와 같이 사용할 수 있다. 

  @Post()
  async fileUploadTest(@UploadedFile("profile") profile: FastifyFile, @Body("name") name: string, @UploadedFiles("images") images: FastifyFile[], @Body() body: any): Promise<string> {
    console.log("profile :", profile);
    console.log("name :", name);
    console.log("images :", images);
    
    return body;
  }

 

파일을 업로드할 방법은 로컬에 올리거나 AWS S3에 올리는 방법이 있는데, 해당 방법을 살펴보자.

 

 

https://github.com/close852/nestjs-toy/tree/05

반응형