Informações gerais
- aula com FIXME para os alunos de programação orientada a serviços, do 4o ano de infoweb, do CNAT-IFRN
- repositório de código
- código final branch zip
objetivo
- validar os arquivos enviados com validadores do nestjs
- validar os arquivos enviados com validador personalizado
notas de aula
sumário
- pegar o código base
- acessar pasta do projeto e instalar bibliotecas do projeto
- executar a api
- incluir módulo nestjs para os novos endpoints
- codar 1 endpoint com validação nestjs para envio de imagem png
- codar 1 endpoint com validação nestjs para envio de imagem jpeg
- codar 1 endpoint com validação personalizada para envio de imagens
1. pegar o código base
pode utilizar o seu próprio código, ou baixar o zip ou fazer o clone do repositório github com o código-fonte do projeto da nota de aula anterior.
lembrando que fazendo o clone do repositório github, precisará executar na pasta do projeto o comando git checkout -b 05-upload-validacao origin/05-upload-validacao
.
2. acessar pasta do projeto e instalar bibliotecas do projeto
[upload-api] $ npm install
3. executar a api
[upload-api] $ npm run start:dev
após lançar a api, o terminal deverá parecer como o console abaixo.
[14:44:53] Starting compilation in watch mode...
[14:44:56] Found 0 errors. Watching for file changes.
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [NestFactory] Starting Nest application...
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] ConfigHostModule dependencies initialized +22ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] AppModule dependencies initialized +1ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] ConfigModule dependencies initialized +1ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] ConfigModule dependencies initialized +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] UploadModule dependencies initialized +1ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] ArmazenamentoModule dependencies initialized +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] ImageKitModule dependencies initialized +1ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [InstanceLoader] NuvemModule dependencies initialized +1ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RoutesResolver] AppController {/}: +32ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/, GET} route +2ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RoutesResolver] UploadController {/upload}: +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/upload/exemplo-simples, POST} route +1ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/upload/arquivos, POST} route +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RoutesResolver] ArmazenamentoController {/armazenamento}: +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/armazenamento, POST} route +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/armazenamento/:nome, GET} route +1ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RoutesResolver] NuvemController {/nuvem}: +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/nuvem/upload, POST} route +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/nuvem/nome/:arquivo_nome, GET} route +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [RouterExplorer] Mapped {/nuvem/id/:arquivo_id, GET} route +0ms
[Nest] 359207 - 20/09/2024, 14:44:57 LOG [NestApplication] Nest application successfully started +3ms
4. incluir módulo nestjs para os novos endpoints
[upload-api] $ npx @nestjs/cli generate resource validacao --no-spec
[upload-api]$ npx @nestjs/cli generate resource validacao --no-spec
? What transport layer do you use? REST API
? Would you like to generate CRUD entry points? No
CREATE src/validacao/validacao.controller.ts (234 bytes)
CREATE src/validacao/validacao.module.ts (276 bytes)
CREATE src/validacao/validacao.service.ts (93 bytes)
UPDATE src/app.module.ts (940 bytes)
após adicionar o recurso/módulo, o terminal deverá parecer como o console abaixo.
[14:46:17] File change detected. Starting incremental compilation...
[14:46:17] Found 0 errors. Watching for file changes.
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [NestFactory] Starting Nest application...
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] ConfigHostModule dependencies initialized +16ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] AppModule dependencies initialized +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] ValidacaoModule dependencies initialized +1ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] ConfigModule dependencies initialized +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] ConfigModule dependencies initialized +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] UploadModule dependencies initialized +1ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] ArmazenamentoModule dependencies initialized +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] ImageKitModule dependencies initialized +1ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [InstanceLoader] NuvemModule dependencies initialized +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RoutesResolver] AppController {/}: +17ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/, GET} route +2ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RoutesResolver] UploadController {/upload}: +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/upload/exemplo-simples, POST} route +1ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/upload/arquivos, POST} route +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RoutesResolver] ArmazenamentoController {/armazenamento}: +1ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/armazenamento, POST} route +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/armazenamento/:nome, GET} route +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RoutesResolver] NuvemController {/nuvem}: +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/nuvem/upload, POST} route +1ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/nuvem/nome/:arquivo_nome, GET} route +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RouterExplorer] Mapped {/nuvem/id/:arquivo_id, GET} route +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [RoutesResolver] ValidacaoController {/validacao}: +0ms
[Nest] 359539 - 20/09/2024, 14:46:18 LOG [NestApplication] Nest application successfully started +2ms
5. codar 1 endpoint com validação nestjs para envio de imagem png
objetivo: criar o endpoint para upload de 1 arquivo imagem png com documentação swagger.
modificar o arquivo ./src/validacao/validacao.controller.ts
.
--import { Controller } from '@nestjs/common';
++import {
++ Controller,
++ HttpStatus,
++ Post,
++ UploadedFile,
++ UseInterceptors,
++} from '@nestjs/common';
++import {
++ ApiBadRequestResponse,
++ ApiBody,
++ ApiConsumes,
++ ApiOperation,
++ ApiResponse,
++ ApiTags,
++} from '@nestjs/swagger';
++import { FileInterceptor } from '@nestjs/platform-express';
import { ValidacaoService } from './validacao.service';
@Controller('validacao')
++@ApiTags('validação')
export class ValidacaoController {
constructor(private readonly validacaoService: ValidacaoService) {}
++
++ @Post('upload/png')
++ @UseInterceptors(FileInterceptor('arquivo_png'))
++ @ApiConsumes('multipart/form-data')
++ @ApiBody({
++ schema: {
++ type: 'object',
++ properties: {
++ arquivo_png: {
++ type: 'string',
++ format: 'binary',
++ },
++ },
++ },
++ })
++ @ApiOperation({ summary: 'Upload de arquivo com armazenamento na nuvem' })
++ @ApiResponse({ status: 201, description: 'Upload de arquivo concluído.' })
++ @ApiBadRequestResponse({
++ status: HttpStatus.BAD_REQUEST,
++ description: 'PROBLEMA com a imagem png enviada.',
++ })
++ upload_png(@UploadedFile() arquivo: Express.Multer.File) {
++ return { estado: 'ok' };
++ }
}
após salvar o arquivo ./src/validacao/validacao.controller.ts
, o terminal onde esta executando a API deve parecer com o console abaixo.
Note que foi adicionado mais um endpoint Mapped {/validacao/upload/png, POST} route
[20:19:27] File change detected. Starting incremental compilation...
[20:19:27] Found 0 errors. Watching for file changes.
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [NestFactory] Starting Nest application...
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] ConfigHostModule dependencies initialized +16ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] AppModule dependencies initialized +0ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] ConfigModule dependencies initialized +1ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] ConfigModule dependencies initialized +0ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] UploadModule dependencies initialized +0ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] ArmazenamentoModule dependencies initialized +0ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] ValidacaoModule dependencies initialized +0ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] ImageKitModule dependencies initialized +1ms
[Nest] 415309 - 20/09/2024, 20:19:28 LOG [InstanceLoader] NuvemModule dependencies initialized +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RoutesResolver] AppController {/}: +18ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/, GET} route +2ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RoutesResolver] UploadController {/upload}: +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/upload/exemplo-simples, POST} route +1ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/upload/arquivos, POST} route +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RoutesResolver] ArmazenamentoController {/armazenamento}: +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/armazenamento, POST} route +1ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/armazenamento/:nome, GET} route +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RoutesResolver] NuvemController {/nuvem}: +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/nuvem/upload, POST} route +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/nuvem/nome/:arquivo_nome, GET} route +1ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/nuvem/id/:arquivo_id, GET} route +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RoutesResolver] ValidacaoController {/validacao}: +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [RouterExplorer] Mapped {/validacao/upload/png, POST} route +0ms
[Nest] 415309 - 20/09/2024, 20:19:29 LOG [NestApplication] Nest application successfully started +3ms
para essa versão do endpoint e qualquer arquivo enviado o resultado será como no console abaixo.
{
"estato": "ok"
}
objetivo: modificar o endpoint para validar o arquivo enviado, aceitando apenas o png.
modificar o arquivo ./src/validacao/validacao.controller.ts
import {
Controller,
++ FileTypeValidator,
HttpStatus,
++ ParseFilePipe,
Post,
UploadedFile,
UseInterceptors,
} from '@nestjs/common';
import { ValidacaoService } from './validacao.service';
import {
ApiBadRequestResponse,
ApiBody,
ApiConsumes,
ApiOperation,
ApiResponse,
ApiTags,
} from '@nestjs/swagger';
import { FileInterceptor } from '@nestjs/platform-express';
@Controller('validacao')
@ApiTags('validação')
export class ValidacaoController {
constructor(private readonly validacaoService: ValidacaoService) {}
@Post('upload/png')
@UseInterceptors(FileInterceptor('arquivo_png'))
@ApiConsumes('multipart/form-data')
@ApiBody({
schema: {
type: 'object',
properties: {
arquivo_png: {
type: 'string',
format: 'binary',
},
},
},
})
@ApiOperation({ summary: 'Upload de arquivo com armazenamento na nuvem' })
@ApiResponse({ status: 201, description: 'Upload de arquivo concluído.' })
@ApiBadRequestResponse({
status: HttpStatus.BAD_REQUEST,
description: 'PROBLEMA com a imagem png enviada.',
})
-- upload_png(@UploadedFile() arquivo: Express.Multer.File) {
++ upload_png(
++ @UploadedFile(
++ new ParseFilePipe({
++ validators: [new FileTypeValidator({ fileType: 'image/png' })],
++ }),
++ )
++ arquivo: Express.Multer.File,
++ ) {
return { estado: 'ok' };
}
}
foi adicionado no decorador (decorator) @UploadedFile
, no parâmetro da assinatura do método upload_png
, um novo objeto new ParseFilePipe
que será responsável por executar as validações de arquivos enviados.
As validações são inseridas no atributo validators
em seguida, e neste caso foi usado apenas o FileTypeValidator para verificar o tipo de arquivo (ver aviso abaixo).
Aviso by nestjs no tutorial sobre File upload com tradução pelo ChatGPT e links by me.
Para verificar o tipo de arquivo, a classe FileTypeValidator usa o tipo detectado pelo multer. Por padrão, o multer extrai o tipo do arquivo a partir da extensão do arquivo no dispositivo do usuário. No entanto, ele não verifica o conteúdo real do arquivo. Como os arquivos podem ser renomeados para extensões arbitrárias, considere usar uma implementação personalizada (como verificar o número mágico do arquivo) se seu aplicativo requer uma solução mais segura.
para esta versão com validação do endpoint, quando enviamos um arquivo imagem png, a resposta continuará a mesma acima.
caso envie qualquer outro tipo de arquivo, a resposta será como o json
abaixo.
{
"message": "Validation failed (expected type is image/png)",
"error": "Bad Request",
"statusCode": 400
}
6. codar 1 endpoint com validação nestjs para envio de imagem jpeg
objetivo: criar o endpoint para upload de 1 arquivo imagem jpeg com documentação swagger.
modificar o arquivo ./src/validacao/validacao.controller.ts
.
import {
Controller,
FileTypeValidator,
HttpStatus,
ParseFilePipe,
Post,
UploadedFile,
UseInterceptors,
} from '@nestjs/common';
import { ValidacaoService } from './validacao.service';
import {
ApiBadRequestResponse,
ApiBody,
ApiConsumes,
ApiOperation,
ApiResponse,
ApiTags,
} from '@nestjs/swagger';
import { FileInterceptor } from '@nestjs/platform-express';
@Controller('validacao')
@ApiTags('validação')
export class ValidacaoController {
constructor(private readonly validacaoService: ValidacaoService) {}
@Post('upload/png')
@UseInterceptors(FileInterceptor('arquivo_png'))
@ApiConsumes('multipart/form-data')
@ApiBody({
schema: {
type: 'object',
properties: {
arquivo_png: {
type: 'string',
format: 'binary',
},
},
},
})
@ApiOperation({ summary: 'Upload de arquivo com armazenamento na nuvem' })
@ApiResponse({ status: 201, description: 'Upload de arquivo concluído.' })
@ApiBadRequestResponse({
status: HttpStatus.BAD_REQUEST,
description: 'PROBLEMA com a imagem png enviada.',
})
upload_png(
@UploadedFile(
new ParseFilePipe({
validators: [new FileTypeValidator({ fileType: 'image/png' })],
}),
)
arquivo: Express.Multer.File,
) {
return { estado: 'ok' };
}
++
++ @Post('upload/jpeg')
++ @UseInterceptors(FileInterceptor('arquivo_jpeg'))
++ @ApiConsumes('multipart/form-data')
++ @ApiBody({
++ schema: {
++ type: 'object',
++ properties: {
++ arquivo_jpeg: {
++ type: 'string',
++ format: 'binary',
++ },
++ },
++ },
++ })
++ @ApiOperation({ summary: 'Upload de arquivo com armazenamento na nuvem' })
++ @ApiResponse({ status: 201, description: 'Upload de arquivo concluído.' })
++ @ApiBadRequestResponse({
++ status: HttpStatus.BAD_REQUEST,
++ description: 'PROBLEMA com a imagem jpeg enviada.',
++ })
++ upload_jpeg(
++ @UploadedFile()
++ arquivo: Express.Multer.File,
++ ) {
++ return { estado: 'ok' };
++ }
}
após salvar o arquivo ./src/validacao/validacao.controller.ts
, o terminal onde esta executando a API deve parecer com o console abaixo.
Note que foi adicionado mais um endpoint Mapped {/validacao/upload/jpeg, POST} route
[20:59:39] File change detected. Starting incremental compilation...
[20:59:39] Found 0 errors. Watching for file changes.
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [NestFactory] Starting Nest application...
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] ConfigHostModule dependencies initialized +34ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] AppModule dependencies initialized +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] ConfigModule dependencies initialized +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] ConfigModule dependencies initialized +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] UploadModule dependencies initialized +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] ArmazenamentoModule dependencies initialized +0ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] ValidacaoModule dependencies initialized +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] ImageKitModule dependencies initialized +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [InstanceLoader] NuvemModule dependencies initialized +2ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RoutesResolver] AppController {/}: +42ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/, GET} route +5ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RoutesResolver] UploadController {/upload}: +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/upload/exemplo-simples, POST} route +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/upload/arquivos, POST} route +0ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RoutesResolver] ArmazenamentoController {/armazenamento}: +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/armazenamento, POST} route +0ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/armazenamento/:nome, GET} route +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RoutesResolver] NuvemController {/nuvem}: +0ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/nuvem/upload, POST} route +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/nuvem/nome/:arquivo_nome, GET} route +0ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/nuvem/id/:arquivo_id, GET} route +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RoutesResolver] ValidacaoController {/validacao}: +0ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/validacao/upload/png, POST} route +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [RouterExplorer] Mapped {/validacao/upload/jpeg, POST} route +1ms
[Nest] 418615 - 20/09/2024, 20:59:41 LOG [NestApplication] Nest application successfully started +4ms
para essa versão do endpoint e qualquer arquivo enviado o resultado será como no console abaixo.
{
"estato": "ok"
}
objetivo: modificar o endpoint para validar o arquivo enviado, aceitando apenas o jpeg e jpg.
modificar o arquivo ./src/validacao/validacao.controller.ts
import {
Controller,
FileTypeValidator,
HttpStatus,
ParseFilePipe,
Post,
UploadedFile,
UseInterceptors,
} from '@nestjs/common';
import { ValidacaoService } from './validacao.service';
import {
ApiBadRequestResponse,
ApiBody,
ApiConsumes,
ApiOperation,
ApiResponse,
ApiTags,
} from '@nestjs/swagger';
import { FileInterceptor } from '@nestjs/platform-express';
@Controller('validacao')
@ApiTags('validação')
export class ValidacaoController {
constructor(private readonly validacaoService: ValidacaoService) {}
@Post('upload/png')
@UseInterceptors(FileInterceptor('arquivo_png'))
@ApiConsumes('multipart/form-data')
@ApiBody({
schema: {
type: 'object',
properties: {
arquivo_png: {
type: 'string',
format: 'binary',
},
},
},
})
@ApiOperation({ summary: 'Upload de arquivo com armazenamento na nuvem' })
@ApiResponse({ status: 201, description: 'Upload de arquivo concluído.' })
@ApiBadRequestResponse({
status: HttpStatus.BAD_REQUEST,
description: 'PROBLEMA com a imagem png enviada.',
})
upload_png(
@UploadedFile(
new ParseFilePipe({
validators: [new FileTypeValidator({ fileType: 'image/png' })],
}),
)
arquivo: Express.Multer.File,
) {
return { estado: 'ok' };
}
@Post('upload/jpeg')
@UseInterceptors(FileInterceptor('arquivo_jpeg'))
@ApiConsumes('multipart/form-data')
@ApiBody({
schema: {
type: 'object',
properties: {
arquivo_jpeg: {
type: 'string',
format: 'binary',
},
},
},
})
@ApiOperation({ summary: 'Upload de arquivo com armazenamento na nuvem' })
@ApiResponse({ status: 201, description: 'Upload de arquivo concluído.' })
@ApiBadRequestResponse({
status: HttpStatus.BAD_REQUEST,
description: 'PROBLEMA com a imagem jpeg enviada.',
})
upload_jpeg(
-- @UploadedFile()
++ @UploadedFile(
++ new ParseFilePipe({
++ validators: [new FileTypeValidator({ fileType: /jpeg|jpg/ })],
++ }),
++ )
arquivo: Express.Multer.File,
) {
return { estado: 'ok' };
}
}
assim como no endpoint anterior /upload/png
, aqui também foi adicionado no decorador (decorator) @UploadedFile
, no parâmetro da assinatura do método upload_jpeg
, um novo objeto new ParseFilePipe
que será responsável por executar as validações de arquivos enviados.
As validações são inseridas no atributo validators
em seguida, e neste caso foi usado apenas o FileTypeValidator para verificar o tipo de arquivo.
contudo neste caso, o valor de fileType
em FileTypeValidator
teve uma expressão regular /jpeg|jpg/
que será processada no interpretada e validada em FileTypeValidator
verifique a extensão do arquivo se é igual a jpeg
ou jpg
por causa do pipe adicionado.
para esta versão com validação do endpoint, quando enviamos um arquivo imagem png, a resposta continuará a mesma acima.
caso envie qualquer outro tipo de arquivo, a resposta será como o json
abaixo.
{
"message": "Validation failed (expected type is /jpeg|jpg/)",
"error": "Bad Request",
"statusCode": 400
}
7. codar 1 endpoint com validação personalizada para envio de imagens
FIXME
Top comments (0)