如何将POST api中的文件和其他输入正确地添加到swagger中?

dwbf0jvd  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(132)

我正在尝试用NestJS创建一个文件上传API的swagger文档。
这是我目前在控制器中拥有的内容:

@ApiTags('files')
@Controller('files')
export class FilesController {

    @ApiConsumes('multipart/form-data')
    @ApiCreatedResponse({description: "This api creates a file in the system"})
    @Post('upload')
    @UseInterceptors(FileInterceptor('file'))
    uploadFile(@UploadedFile() file, @Body() fileInfo: UploadFileDto) {
        console.log(file);
        console.log(fileInfo);  
    }
}

在我DTO文件中:

import { IsString } from 'class-validator'
import { ApiProperty } from '@nestjs/swagger'

export class UploadFileDto {
    @IsString()
    communityName: string

    @IsString()
    type: string

    @ApiProperty({type:"file"})
    file: any;
}

这样一来,它就可以 swagger 地展示一切但是,正如您所看到的,在我的DTO类和函数变量中有一个冗余的“file”变量。如果我从DTO中删除“file”属性,那么swagger UI不会将此参数识别为文件输入。如果我从函数参数中删除它,然后它显示在swagger UI中,但是控制器没有接收到上传的文件。有什么方法可以纠正这个问题吗?

  • 谢谢-谢谢
mfuanj7w

mfuanj7w1#

我刚刚遇到了同样的问题,多亏了你,我实际上解决了我的问题。
我的控制器如下所示

@Controller('files')
@ApiTags('files')
export class FilesController
{
    @Post('import')
    @ApiConsumes("multipart/form-data")
    @UseInterceptors(FileInterceptor('file',
        {
            storage: diskStorage({
                destination: './tmp', 
                filename: (req, file, cb) => {
                    const randomName = Array(32).fill(null).map(() => (Math.round(Math.random() * 16)).toString(16)).join('')
                    return cb(null, `${randomName}${extname(file.originalname)}`)
                }
            })
        }
    ))
    async upload(
        @Body() uploadDto: UploadDto,
        @UploadedFile() file: Express.Multer.File
    ): Promise<void>
    {
        console.log(importDto);
        console.log(file);
    }
}

还有我的DTO

import { IsString } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';

export class ImportDto {

    @IsString()
    name: string;

    @ApiProperty({ type:'string', format:'binary' })
    file: any;
}

注意,唯一真实的的变化是在DTO的@ApiProperty()中。

相关问题