在 Swagger NestJs 中上传文件和其他数据
File uploading along with other data in Swagger NestJs
我想随 JSON
一起发送文件
{
"comment" : "string",
"outletId" : 1
}
我从文档中得到的帮助是
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
orderId:
type: integer
userId:
type: integer
fileName:
type: string
format: binary
我不知道将此架构放在哪里。我试过将它放在 DTO 的 @ApiProperty()
和 @ApiOperations
中,但无法解决问题。
下面是我要捕获文件内容的函数。
@Post('/punchin')
@ApiConsumes('multipart/form-data')
@ApiOperation({ summary: 'Attendance Punch In' })
@UseInterceptors(CrudRequestInterceptor, ClassSerializerInterceptor, FileInterceptor('file'))
@ApiImplicitFile({ name: 'file' })
async punchInAttendance( @Body() body: PunchInDto, @UploadedFile() file: Express.Multer.File ): Promise<Attendance> {
const imageUrl = await this.s3FileUploadService.upload(file)
console.log(body, imageUrl)
return await this.service.punchInAttendance({
comment: body.punchInComment,
outletId: body.outletId,
imgUrl: imageUrl,
})
}
使用 @ApiBody
因为正文会保存您的数据。
@Post('upload')
@ApiConsumes('multipart/form-data')
@ApiBody({
schema: {
type: 'object',
properties: {
comment: { type: 'string' },
outletId: { type: 'integer' },
file: {
type: 'string',
format: 'binary',
},
},
},
})
@UseInterceptors(FileExtender)
@UseInterceptors(FileInterceptor('file'))
uploadFile2(@UploadedFile('file') file) {
console.log(file);
}
我进入控制台:
{
fieldname: 'file',
originalname: 'dart.txt',
encoding: '7bit',
mimetype: 'text/plain',
buffer: <Buffer 20 0a 69 6d ... 401 more bytes>,
size: 451,
comment: 'some comment',
outletId: 123456
}
因为FileInterceptor
删除了主体参数,我使用了FileExtender
拦截器,将comment
和outletId
打包在文件属性中。
@Injectable()
export class FileExtender implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const req = context.switchToHttp().getRequest();
req.file['comment'] = req.body.comment;
req.file['outletId'] = Number(req.body.outletId);
return next.handle();
}
}
我想随 JSON
一起发送文件{
"comment" : "string",
"outletId" : 1
}
我从文档中得到的帮助是
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
orderId:
type: integer
userId:
type: integer
fileName:
type: string
format: binary
我不知道将此架构放在哪里。我试过将它放在 DTO 的 @ApiProperty()
和 @ApiOperations
中,但无法解决问题。
下面是我要捕获文件内容的函数。
@Post('/punchin')
@ApiConsumes('multipart/form-data')
@ApiOperation({ summary: 'Attendance Punch In' })
@UseInterceptors(CrudRequestInterceptor, ClassSerializerInterceptor, FileInterceptor('file'))
@ApiImplicitFile({ name: 'file' })
async punchInAttendance( @Body() body: PunchInDto, @UploadedFile() file: Express.Multer.File ): Promise<Attendance> {
const imageUrl = await this.s3FileUploadService.upload(file)
console.log(body, imageUrl)
return await this.service.punchInAttendance({
comment: body.punchInComment,
outletId: body.outletId,
imgUrl: imageUrl,
})
}
使用 @ApiBody
因为正文会保存您的数据。
@Post('upload')
@ApiConsumes('multipart/form-data')
@ApiBody({
schema: {
type: 'object',
properties: {
comment: { type: 'string' },
outletId: { type: 'integer' },
file: {
type: 'string',
format: 'binary',
},
},
},
})
@UseInterceptors(FileExtender)
@UseInterceptors(FileInterceptor('file'))
uploadFile2(@UploadedFile('file') file) {
console.log(file);
}
我进入控制台:
{
fieldname: 'file',
originalname: 'dart.txt',
encoding: '7bit',
mimetype: 'text/plain',
buffer: <Buffer 20 0a 69 6d ... 401 more bytes>,
size: 451,
comment: 'some comment',
outletId: 123456
}
因为FileInterceptor
删除了主体参数,我使用了FileExtender
拦截器,将comment
和outletId
打包在文件属性中。
@Injectable()
export class FileExtender implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const req = context.switchToHttp().getRequest();
req.file['comment'] = req.body.comment;
req.file['outletId'] = Number(req.body.outletId);
return next.handle();
}
}