Как смоделировать многочастную загрузку файлов при использовании Spring и Apache File Upload - PullRequest
0 голосов
/ 18 января 2019

Проект, над которым я работаю, должен поддерживать загрузку больших файлов и знать время, затраченное на их загрузку.

Для обработки больших файлов я использую потоковый API Apache FileUpload, это также позволяет мне измерить время, необходимое для сохранения всего потока.

Проблема, с которой я столкнулся, заключается в том, что я не могу использовать 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 голосов
/ 28 мая 2019

Подход MockMultipartFile не будет работать, поскольку Spring работает за кулисами и просто передает файл.

Завершено использованием RestTemplate вместо этого, поскольку фактически создает запросы.

...