Я реализовал немного другое решение, вдохновленное http://rugal.ga/development/2015/10/03/uploading-file-other-than-post/, и близкое к предыдущему посту:
public class ExtendedMultipartResolver extends CommonsMultipartResolver {
@Override
public boolean isMultipart(HttpServletRequest request) {
return (request != null && isMultipartContent(request));
}
/**
* Extends ServletFileUpload.isMultipartContent() behavior to allow PUT requests as multipart.
*
* @param request
* The servlet request to be evaluated. Must be non-null.
*
* @return <code>true</code> if the request is multipart; <code>false</code> otherwise.
* @see org.apache.commons.fileupload.servlet.ServletFileUpload#isMultipartContent
*/
public static final boolean isMultipartContent(HttpServletRequest request) {
HttpMethod httpMethod = HttpMethod.valueOf(request.getMethod());
if (HttpMethod.POST != httpMethod && HttpMethod.PUT != httpMethod) {
return false;
}
return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}
}
Ничего нового здесь, кроме того, что мой код полагаетсяна org.apache.commons.fileupload.FileUploadBase.isMultipartContent (RequestContext) вместо дублирования его содержимого.
Теперь, если вам когда-либо понадобилось реализовать модульные тесты служб загрузки файлов, вы могли бы использовать org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload () следующим образом:
@Test
public void testUploadFilePost() throws Exception {
MockMultipartFile multipartFile = new MockMultipartFile(...);
String url = ...;
mockMvc.perform(fileUpload(url).file(multipartFile)).andExpect(status().isOk());
}
Приведенный выше код может выдавать только POST-запросы из-за способа org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder реализован.Чтобы выполнить модульное тестирование загрузки файла PUT, вас может заинтересовать следующий код:
private static final RequestPostProcessor PUT_REQUEST_POST_PROCESSOR = new RequestPostProcessor() {
@Override
public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
request.setMethod(HttpMethod.PUT.name());
return request;
}
};
private static MockHttpServletRequestBuilder putFileUpload(String url, MockMultipartFile multipartFile,
Object... urlVariables) {
return fileUpload(url, urlVariables).file(multipartFile).with(PUT_REQUEST_POST_PROCESSOR);
}
Теперь тест можно адаптировать следующим образом:
@Test
public void testUploadFilePut() throws Exception {
MockMultipartFile multipartFile = new MockMultipartFile(...);
String url = ...;
mockMvc.perform(putFileUpload(url, multipartFile)).andExpect(status().isOk());
}