knife4j icon indicating copy to clipboard operation
knife4j copied to clipboard

文件上传 multipart/data 同时接受文件和对象,调试时上传文件失效

Open woshiwco opened this issue 6 months ago • 5 comments

Describe the bug 当定义multipart/data类型的请求,同时接收文件和json对象时,文件上传按钮没有了,且变成了url的query参数;图1为原生swagger的行为,是预期的,图二是knife4j的行为,是被认为bug的。是否knife4j解析上出现了问题,或者有没有其他注解方式能够使knife4j按预期工作。

Image

Image

类似issu https://github.com/xiaoymin/knife4j/issues/544

To Reproduce 1.依赖版本: <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> 4.4.0 2.controller接口: @PostMapping(value = "/add", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary = "新增缺陷扫描记录", description = "上传缺陷扫描详情 (JSON) 和一个可选的授权文件。") public void add( @RequestPart("addFlawScanRO") @Valid AddFlawScanRO addFlawScanRO, @RequestPart("authorisationFile") MultipartFile authorisationFile) throws BusinessException, IOException { // flawScanService.add(addFlawScanBean, authorisationFile); }

woshiwco avatar Jun 20 '25 07:06 woshiwco

我在多次尝试文件和对象同时出现在请求参数并没有找到knife4j正确加载文件和json对象的方法,但以下方法可以以表单格式正确加载文件和自定义类对象: 对象加@ParameterObject注解且不加@RequestBody或@RequestPart,文件加@RequestPart注解,此时文档可按请求数据类型为multipart/form-data正常显示,如下图:

Image Image

lurfen avatar Jul 19 '25 03:07 lurfen

我在多次尝试文件和对象同时出现在请求参数并没有找到knife4j正确加载文件和json对象的方法,但以下方法可以以表单格式正确加载文件和自定义类对象: 对象加@ParameterObject注解且不加@RequestBody或@RequestPart,文件加@RequestPart注解,此时文档可按请求数据类型为multipart/form-data正常显示,如下图:

Image Image

@lurfen 试了下,这种方式@ParameterObject修饰的对象并不是以json方式传参,而是将对象中的每个属性当作multipart/form-data中的一个参数。并没有像原生swagger一样工作。

woshiwco avatar Jul 22 '25 04:07 woshiwco

我在多次尝试文件和对象同时出现在请求参数并没有找到knife4j正确加载文件和json对象的方法,但以下方法可以以表单格式正确加载文件和自定义类对象: 对象加@ParameterObject注解且不加@RequestBody或@RequestPart,文件加@RequestPart注解,此时文档可按请求数据类型为multipart/form-data正常显示,如下图: Image Image

@lurfen 试了下,这种方式@ParameterObject修饰的对象并不是以json方式传参,而是将对象中的每个属性当作multipart/form-data中的一个参数。并没有像原生swagger一样工作。

对的,我想表达的就是我没有找到让knife4j像原始swagger那样以json传参的方式,只找到我上面提到的方式来通过multipart/form-data表单格式传参,其他方式会导致接口文档没有选择文件按钮

lurfen avatar Jul 22 '25 06:07 lurfen

upload(@RequestPart MultipartFile file, @Valid AppUploadDTO body) 这在knife4j 3.0.3中还能被正确识别为form-data形式; 到了knife4j 4.5.0后 就变成raw格式了, 而且file 还是文本框不能选择文件 我现在是 upload(@RequestPart MultipartFile file,@ParameterObject @Valid AppUploadDTO body) 可以跟原先类似 但是现在@ParameterObject 无法正确识别dto里面的字段类型 现在是配合@Schema的type来显性指定类型

Edian-Midir avatar Oct 21 '25 07:10 Edian-Midir

upload(@RequestPart MultipartFile file, @Valid AppUploadDTO body)这在knife4j 3.0.3中还能被正确识别为form-data形式;到了knife4j 4.5.0后 就变成raw格式了,而且file 还是文本框不能选择文件 我现在是 可以跟原先类似 但是现在@ParameterObject无法正确识别dto里面的字段类型 现在是配合的type来显性指定类型upload(@RequestPart MultipartFile file,@ParameterObject @Valid AppUploadDTO body)

还发现一个问题,开启default-flat-param-object: true后所有@RequestPart MultipartFile file都没了

Edian-Midir avatar Oct 23 '25 03:10 Edian-Midir