<p align="center">
  <a href="https://webundsoehne.com" target="blank">
    <img src="https://webundsoehne.com/wp-content/uploads/webundsoehne-logo.png" width="320" alt="Web und Söhne - Logo" />
  </a>
</p>
Web & Söhne is Austria's leading expert in programming and implementing complex and large web projects.


# Port of Nest's file upload and MulterModule for FastifyAdapter
Compatibile with NestJS 7-11 and Fastify 3-5.

# Steps:

## Application Setup
Install to your project:

`npm i @webundsoehne/nest-fastify-file-upload`

Configure your NestApplication to use the correct body parser.

### Nest 11+ / Fastify 5

Install `npm i @fastify/multipart` as multipart body parser.

Register `fastifyMultipart` in your root application after creation:

``` typescript
import { NestFactory } from '@nestjs/core'
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'
import { fastifyMultipart } from '@fastify/multipart'

import { AppModule } from './app.module'

async function bootstrap (): Promise<void> {
  const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter())

  await app.register(fastifyMultipart)

  await app.listen(3000)
}

```

### Nest <= 10 / Fastify 3-4

Register `contentParser` in your root application after creation:

``` typescript
import { NestFactory } from '@nestjs/core'
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'
import { contentParser } from 'fastify-multer'

import { AppModule } from './app.module'

async function bootstrap (): Promise<void> {
  const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter())

  await app.register(contentParser)

  await app.listen(3000)
}

bootstrap()
```

## File Controller Setup

Use it like the official NestJS package for Express in your controllers:

``` typescript
@Post('upload')
@UseInterceptors(FileInterceptor('file'))
@ApiFileBody('file')
@ApiConsumes('multipart/form-data')
uploadFile (@UploadedFile('file') file: MulterFile): void {
    console.log(file)
}

...
```

The package will export the missing `Express.Multer.*` types as `Multer*`.

> more information: https://docs.nestjs.com/techniques/file-upload

### @ApiFileBody Decorator
Useful controller decorator that adds file upload functionality in Swagger.

You can specify the file key as parameter, default key is `file`.

## MulterModule
Register the MulterModule e.g. to directly upload to a specified directory.

```
import { Module } from '@nestjs/common'

import { AppController } from './app.controller'
import {MulterModule} from "../multer.module";

@Module({
  controllers: [AppController],
  imports: [
      MulterModule.register({dest: './uploads'})
  ]
})
export class AppModule { }
```

> more information and options: https://docs.nestjs.com/techniques/file-upload#default-options


## Stay in touch
* Do you have any additional questions?
* Author: [Backend Team](mailto:backend@webundsoehne.com)
* Website: [Web & Söhne](https://webundsoehne.com)
