{"library":"nestjs-form-data","title":"NestJS FormData Handling","description":"nestjs-form-data provides an object-oriented approach to managing `multipart/form-data` requests in NestJS, specifically designed for file uploads and form field serialization. Unlike the built-in Multer integration, it allows files to be treated as first-class properties within Data Transfer Objects (DTOs), enabling declarative validation with `class-validator` and `class-transformer`. The current stable version is `11.0.1`, with active development indicated by recent major releases addressing features, fixes, and security concerns. Key differentiators include automatic cleanup of temporary files, pluggable storage options (memory, file system, or custom), reliable MIME type detection using magic numbers, and full support for nested objects in form data. It is compatible with NestJS versions 7 through 11 and supports both Express and Fastify platforms.","language":"javascript","status":"active","last_verified":"Thu Apr 23","install":{"commands":["npm install nestjs-form-data"],"cli":null},"imports":["import { NestjsFormDataModule } from 'nestjs-form-data'","import { FormDataRequest } from 'nestjs-form-data'","import { MemoryStoredFile } from 'nestjs-form-data'","import { IsFile, MaxFileSize, HasMimeType } from 'nestjs-form-data'"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import { NestFactory } from '@nestjs/core';\nimport { ValidationPipe, Module, Controller, Post, Body } from '@nestjs/common';\nimport { NestjsFormDataModule, FormDataRequest, MemoryStoredFile, IsFile, MaxFileSize, HasMimeType } from 'nestjs-form-data';\n\n// 1. Define your DTO for file upload and form fields\nclass UploadAvatarDto {\n  @IsFile()\n  @MaxFileSize(1e6, { message: 'Avatar file size must not exceed 1MB' })\n  @HasMimeType(['image/jpeg', 'image/png'], { message: 'Avatar must be a JPEG or PNG image' })\n  avatar: MemoryStoredFile;\n\n  @Body('userId')\n  userId: string;\n}\n\n// 2. Create your controller\n@Controller('users')\nexport class UsersController {\n  @Post('avatar')\n  @FormDataRequest() // Apply the decorator to enable form data parsing\n  uploadAvatar(@Body() dto: UploadAvatarDto) {\n    // dto.avatar is now a MemoryStoredFile instance\n    console.log(`User ${dto.userId} uploaded avatar:`);\n    console.log(`Original Name: ${dto.avatar.originalName}`);\n    console.log(`Size: ${dto.avatar.size} bytes`);\n    console.log(`MIME Type: ${dto.avatar.mimeType}`);\n    console.log(`Buffer length: ${dto.avatar.buffer.length}`);\n\n    // In a real application, you would save dto.avatar.buffer to storage (e.g., S3, local disk)\n    return { message: `Avatar for user ${dto.userId} uploaded successfully!` };\n  }\n}\n\n// 3. Register the module and global validation pipe\n@Module({\n  imports: [\n    NestjsFormDataModule.config({\n      is// Enable file system storage by default, or keep MemoryStoredFile as default\n      // storage: FileSystemStoredFile, \n    }),\n  ],\n  controllers: [UsersController],\n})\nexport class AppModule {}\n\n// 4. Bootstrap your NestJS application\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule);\n\n  app.useGlobalPipes(\n    new ValidationPipe({\n      transform: true, // Crucial for DTO transformation and file object hydration\n      whitelist: true, // Recommended for security\n      forbidNonWhitelisted: true, // Recommended for security\n    }),\n  );\n\n  await app.listen(3000);\n  console.log('Application is running on: http://localhost:3000');\n}\nbootstrap();","lang":"typescript","description":"This quickstart demonstrates how to set up `nestjs-form-data` to handle a single file upload along with a text field. It defines a DTO with file-specific validation decorators, applies the `@FormDataRequest()` decorator to a controller method, and configures a global `ValidationPipe` for DTO transformation.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":null}