[英]How to Post multipart/form-data for a File Upload using SpringMVC and MockMVC
我創建了一個使用javax.ws.rs工作得很好的照片上傳器。 這是它的標志性和基本要點:
@POST
@Path("/upload/photo")
@Consumes("multipart/form-data")
@Produces("application/json")
public String uploadPhoto(InputStream stream){
try {
int read = 0;
FileOutputStream fos = new FileOutputStream(file);
CountingOutputStream out = new CountingOutputStream(fos);
byte[] bytes = new byte[MAX_UPLOAD_SIZE];
while ((read = stream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
} catch (IOException e) {
// TODO throw!
e.printStackTrace();
}
//...
}
我可以使用apache.commons.httpClient庫測試這個,如下所示:
@Test
public void testUpload() {
int statusCode = 0;
String methodResult = null;
String endpoint = SERVICE_HOST + "/upload/photo";
PostMethod post = new PostMethod(endpoint);
File file = new File("/home/me/Desktop/someFolder/image.jpg");
FileRequestEntity entity = new FileRequestEntity(file, "multipart/form-data");
post.setRequestEntity(entity);
try {
httpClient.executeMethod(post);
methodResult = post.getResponseBodyAsString();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
statusCode = post.getStatusCode();
post.releaseConnection();
//...
}
這很棒! 問題是應用程序的其余部分是使用Spring MVC編寫的。 當我使用Spring Mock MVC測試框架時,程序就會掛起(顯示在這個下面的代碼片段中)。 以下是上傳者的SpringMVC代碼:
@ResponseBody
@RequestMapping( produces="application/json",
consumes="multipart/form-data",
method=RequestMethod.POST,
value="/photo")
public String uploadPhoto(@RequestPart("file") MultipartFile multipartFile){
try {
int read = 0;
FileOutputStream fos = new FileOutputStream(file);
CountingOutputStream out = new CountingOutputStream(fos);
byte[] bytes = new byte[MAX_UPLOAD_SIZE];
while ((read = multipartFile.getInputStream().read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
} catch (IOException e) {
// TODO throw!
e.printStackTrace();
}
//...
}
以下是我使用Spring Mock MVC實現的測試。 我認為問題與使用fileUpload(...)有關。 有沒有辦法測試使用正常的帖子(..),就像我可以用apache? 我更喜歡使用InputStream作為參數,並避免使用MultipartFile。
@Test
public void testUpload() throws Exception {
String endpoint = BASE_URL + "/upload/photo";
FileInputStream fis = new FileInputStream("/home/me/Desktop/someFolder/image.jpg");
MockMultipartFile multipartFile = new MockMultipartFile("file", fis);
mockMvc.perform(fileUpload(endpoint)
.file(multipartFile)
.contentType(MediaType.MULTIPART_FORM_DATA))
.andExpect(status().isOk());
}
理想情況下,我想使用Spring MVC和Spring Mock MVC框架,但我提供的代碼只是掛在while語句中。 就Spring測試中使用fileUpload方法而言,我正在做的是什么? 任何建議表示贊賞。
此外,使用java.io中的普通舊InputStream作為upload方法的參數是安全的,並且仍然在請求中使用MockMultipartFile。
@Test
public void testUpload() throws Exception {
String endpoint = BASE_URL + "/upload/photo";
FileInputStream fis = new FileInputStream("/home/me/Desktop/someDir/image.jpg");
MockMultipartFile multipartFile = new MockMultipartFile("file", fis);
HashMap<String, String> contentTypeParams = new HashMap<String, String>();
contentTypeParams.put("boundary", "265001916915724");
MediaType mediaType = new MediaType("multipart", "form-data", contentTypeParams);
mockMvc.perform(
post(endpoint)
.content(multipartFile.getBytes())
.contentType(mediaType))
.andExpect(status().isOk());
}
MockMvcRequestBuilders.fileUpload:
@Test
public void uploadTest() throws Exception {
String endpoint = "/service/productsale/5/upload";
FileInputStream fis = new FileInputStream("E:\\test\\test.jpg");
MockMultipartFile multipartFile = new MockMultipartFile("file",fis);
mockMvc.perform(MockMvcRequestBuilders.fileUpload(endpoint).file(multipartFile))
.andExpect(MockMvcResultMatchers.model().attributeExists("imageVo"))
.andDo(print())
.andExpect(status().isOk());
}
通過參考該文檔 ,下面的代碼可以更簡單。
@Test
public void testFileUpload() throws Exception {
FileInputStream input = new FileInputStream("/Downloads/WX.png");
MockMultipartFile file = new MockMultipartFile(
"image",
"WX20180207-134704@2x.png",
"image/png",
input);
this.mockMvc
.perform(
multipart("/api/note/image/create")
.file(file)
.header("Authorization", "BearereyJhbGciOiJIUzUxMiJ9")
);
}
這個鏈接幫助了我: https : //samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-java-based-config/
更具體地說,這個配置:@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.