使用 Spring 和 Apache 文件上传时如何模拟分段文件上传
How to mock a multipart file upload when using Spring and Apache File Upload
我正在处理的项目需要支持大文件上传并知道上传过程中花费的时间。
为了处理大文件,我使用 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: the
request was rejected because no multipart boundary was found
有人能帮忙吗?
MockMultipartFile
方法行不通,因为 Spring 确实在幕后工作,只是传递文件。
最终使用 RestTemplate
代替,因为它实际上构建了请求。
我正在处理的项目需要支持大文件上传并知道上传过程中花费的时间。
为了处理大文件,我使用 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: the request was rejected because no multipart boundary was found
有人能帮忙吗?
MockMultipartFile
方法行不通,因为 Spring 确实在幕后工作,只是传递文件。
最终使用 RestTemplate
代替,因为它实际上构建了请求。