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에 올리는 방법이 있는데, 해당 방법을 살펴보자.
반응형
'Nodejs > NestJS' 카테고리의 다른 글
[NestJS] nest-winston 사용하기 07 (1) | 2024.05.27 |
---|---|
[NestJS] 파일 업로드 처리 로컬 & AWS S3 06 (0) | 2024.05.27 |
[NestJS] fastify middleware 추가하기(@fastify/multipart) 04 (0) | 2024.05.27 |
[NestJS] TypeORM(MySQL) 설정 Migration 포함 03 (0) | 2024.05.26 |
[NestJS] config 불러오기 설정 추가 02 (0) | 2024.05.26 |