使用Spring mvc和MockMVC上传文件

我已成功将图像文件上传到WebContent\resources\uploads\image.jsp 。 但我在使用MockMvc测试时遇到了问题。 当我运行测试用例时,我发现未找到exception文件拒绝访问

控制器看起来像这样:

 @RequestMapping(value="/AddContacts", method=RequestMethod.POST) public @ResponseBody String addContacts(ContactBean cb,HttpServletRequest request,HttpServletResponse response,@RequestParam("upload") MultipartFile file) throws IllegalStateException, IOException { String error=cb.validate(); if(error.equals("")){ Model m=new Model(); String ret=m.addData(cb); System.out.println("Contact Bean: "+cb); if(ret.equals("DBFAIL")){ response.setStatus(500); } else if(ret.equals("EXIST")){ response.setStatus(409); } else{ response.setStatus(200); /* to upload a file */ if(file != null && file.getSize() > 0){ System.out.println("File name: "+file.getOriginalFilename()); String dir="C:\\web_latest\\Admin_FileUpload_29_01_15\\WebContent\\resources\\uploads\\"+cb.getName()+"_"+cb.getId()+"\\"; //String dir="C:\\Upload\\"+cb.getName()+"_"+cb.getId()+"\\"; File directory = new File(dir); if (directory.exists()) { System.out.println("Directory already exists ..."); } else { System.out.println("Directory not exists, creating now"); boolean success = directory.mkdir(); if (success) { System.out.printf("Successfully created new directory : %s%n", dir); } else { System.out.printf("Failed to create new directory: %s%n", dir); } } String fileName = file.getOriginalFilename(); file.transferTo(new File(dir+fileName)); } } return error; } else{ //response.setStatus(500); return error; } } 

我的测试用例是这样的:

 public void testAddContacts() throws Exception { FileInputStream fis=new FileInputStream("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg"); //MockMultipartFile upload = new MockMultipartFile("upload", "Penguins.jpg", "image/jpeg", "C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg\\".getBytes()); MockMultipartFile upload= new MockMultipartFile("upload",fis); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); mockMvc.perform(MockMvcRequestBuilders.fileUpload("/AddContacts") .file(upload) .param("some-random", "4") .param("name","deerdad") .param("email","niharik@gmail.com") .param("phone", "1234567890")) .andExpect(status().is(200)); } 

我的jsp文件是这样的:

       Insert title here    function doAdd() { // get the form values var name = $('#name').val(); var email = $('#email').val(); var phone = $('#phone').val(); var file = document.getElementById("uploadfile"); var formData = new FormData(); formData.append("upload", file.files[0]); formData.append("name",$('#name').val()); formData.append("email",$('#email').val()); formData.append("phone",$('#phone').val()); $.ajax({ type: "POST", url: "AddContacts", data: formData, processData: false, contentType: false, success: function(response){ $("#error").text(""); if(response==""){ $("#info").text("successfully added"); $('#myTable').append(""+name + ""+email + ""+phone + ""); $("#addForm").hide(); } else{ $("#info").text(response); } }, error: function(){ $("#info").text(""); $("#error").text("Internal server error"); }, statusCode: { 409: function(response,statusText) { $("#info").text(""); $("#error").text("Name already exists ["+response.statusText+"]"); }, 500: function(response,statusText) { $("#info").text(""); $("#error").text("database problem ["+response.statusText+"]"); } } }); }     

Add Contacts Please fill all the texts in the fields

<!--
Add Me
--> <!--
Name :

Email :

Phone :


-->

 public void testAddContacts() throws Exception{ File f = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg"); System.out.println(f.isFile()+" "+f.getName()+f.exists()); FileInputStream fi1 = new FileInputStream(f); FileInputStream fi2 = new FileInputStream(new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Tulips.jpg")); MockMultipartFile fstmp = new MockMultipartFile("upload", f.getName(), "multipart/form-data",fi1); MockMultipartFile secmp = new MockMultipartFile("upload", "Tulips.jpg","multipart/form-data",fi2); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); mockMvc.perform(MockMvcRequestBuilders.fileUpload("/AddContacts") .file(fstmp) .file(secmp) .param("name","abc").param("email","abc@gmail.com").param("phone", "1234567890")) .andExpect(status().isOk()); } 

不推荐使用方法MockMvcRequestBuilders.fileUpload

fileUpload @Deprecated public static
MockMultipartHttpServletRequestBuilder fileUpload(java.net.URI uri)
已过时。 支持multipart(URI)创建一个
用于多部分请求的MockMultipartHttpServletRequestBuilder。
参数:uri – URL自:
4.0.3

要使用这种方式而不是fileUpload()

  MockMultipartFile mockMultipartFile = new MockMultipartFile("user-file",fileName, "text/plain", "test data".getBytes()); MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.multipart("/upload") .file(mockMultipartFile); 

要么

 MockMultipartFile jsonFile = new MockMultipartFile("test.json", "", "application/json", "{\"key1\": \"value1\"}".getBytes()); mockMvc.perform(MockMvcRequestBuilders.multipart("/fileUpload") .file("file", jsonFile.getBytes()) .characterEncoding("UTF-8"))