当在 NestJS 中实现文件上传以及参数验证时,我们可以使用 multer 中间件来处理文件上传。
yarn add @nestjs/platform-express multer @types/multer
upload.controller.dto
import {
Body,
Controller,
ParseFilePipe,
Post,
UploadedFile,
UseInterceptors,
} from '@nestjs/common';
import { UploadService } from './upload.service';
import { uploadDto } from './dto/upload.dto';
import { Public } from 'src/common/constants/jwt.constants';
import { FileInterceptor } from '@nestjs/platform-express';
@Controller('upload')
export class UploadController {
constructor(private readonly uploadService: UploadService) {}
@Public()
@Post('file')
// FileInterceptor是multer实现的拦截器接收两个参数,第一个是文件的字段名,第二个是MulterOptions,用于MulterModule实现的本地磁盘上传,这里不做深入
@UseInterceptors(FileInterceptor('file'))
upload(
// 因为UploadedFile不参与参数管道认证,所以如果需要的话可以引入ParseFilePipe,配置见文档
// @UploadedFile(new ParseFilePipe())
// @UploadedFile装饰器 取出file字段
@UploadedFile()
// 在添加了@types/multer依赖后,会增加Express上增加Multer.Filter类型
file: Express.Multer.File,
// 非文件字段会保留在body中
@Body() body: uploadDto,
) {
console.log('🚀 ~ UploadController ~ file:', file);
return this.uploadService.putFile(body.filename, file);
}
}