使用Spring和Apache File Upload时如何模拟多部分文件上传

时间:2019-01-18 09:21:00

标签: spring apache file upload mockmvc

我正在从事的项目需要支持大文件上传,并且需要知道在上传过程中花费的时间。

要处理我正在使用Apache FileUpload的流API的大文件,这还使我能够测量保存完整流所需的时间。

我遇到的问题是,我似乎无法在此控制器的集成测试中使用MockMvc。我知道控制器可以正常工作,因为我已经使用邮递员成功上传了文件。

简化的控制器代码:

@PostMapping("/upload")
public String handleUpload(HttpServletRequest request) throws Exception {
    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator iterStream = upload.getItemIterator(request);
    while (iterStream.hasNext()) {
        FileItemStream item = iterStream.next();
        String name = item.getFieldName();
        InputStream stream = item.openStream();
        if (!item.isFormField()) {
            // Process the InputStream
        } else {
            String formFieldValue = Streams.asString(stream);
        }
    }
}

简化的测试代码:

private fun uploadFile(tfr: TestFileContainer) {
    val mockFile = MockMultipartFile("file", tfr.getData()) // .getData*() returns a ByteArray


    val receiveFileRequest = MockMvcRequestBuilders.multipart("/upload")
    .file(mockFile)
    .contentType(MediaType.MULTIPART_FORM_DATA)

    val result = mockMvc.perform(receiveFileRequest)
      .andExpect(status().isCreated)
      .andExpect(header().exists(LOCATION))
      .andReturn(

}

这是我目前遇到的错误

  

org.apache.tomcat.util.http.fileupload.FileUploadException:   该请求被拒绝,因为未找到多部分边界

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

MockMultipartFile方法无效,因为Spring确实在幕后工作,只是将文件传递给周围。

最终使用RestTemplate代替,因为它实际上是在构造请求。