You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBootTest中使用WebTestClient无法上传文件的问题

问题解决:WebTestClient 文件上传提示 Required part 'document' is not present

问题原因

测试代码中直接用字节数组构建multipart part,缺少MultipartFile所需的元数据(比如文件名、content-disposition头的filename参数),导致服务器端无法将请求中的part映射到@RequestPart MultipartFile参数,因此抛出400错误。

解决方案

把字节数组替换为Spring的ClassPathResource(或FileSystemResource)构建multipart part,WebTestClient会自动处理必要的元数据,确保服务器端能正确解析为MultipartFile。

修改后的测试代码如下:

@SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ApplicationTest {

    @Autowired
    private WebTestClient webTestClient;
    
    @Test
    void saveDocumentSuccessfully() {
        webTestClient.post().uri("/upload")
         .contentType(MediaType.MULTIPART_FORM_DATA)
         .body(BodyInserters.fromMultipartData(createMultipartBodyBuilder().build()))
         .exchange()
         .expectStatus().is2xxSuccessful();
    }
    
    private @NotNull MultipartBodyBuilder createMultipartBodyBuilder() {
        final MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();
        // 使用ClassPathResource直接读取测试资源文件
        multipartBodyBuilder.part("document", 
            new ClassPathResource("thumb_oct22_02.jpg"), 
            MediaType.IMAGE_JPEG);
        return multipartBodyBuilder;
    }

}

额外说明

  • ClassPathResource会自动从classpath加载文件,无需手动读取字节数组,代码更简洁可靠。
  • 如果文件不在classpath下,可改用FileSystemResource指定文件路径。
  • 外部REST客户端正常是因为它们会自动在multipart请求中添加filename等元数据,而直接传字节数组时WebTestClient不会自动补充这些信息。

内容的提问来源于stack exchange,提问作者Mathias Arens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:36:08