2016-08-18 87 views
0

我使用的是Spring 4的最新版本,我通常沒有問題編寫RESTful控制器。有一個傳統的Web應用程序,它使用java.net.HTTPUrlConnection來執行多部分上傳。我們上傳的數據有3條: 1是PDF文件,我們有字節,那麼另外兩條數據只是2個字符串字段。Spring MVC文件上傳與多部分數據和單元測試

首先讓我告訴你春天REST控制器接受數據:

@RequestMapping(value = "/save", method = RequestMethod.POST, produces = "application/json", consumes = "multipart/form-data") 
public @ResponseBody boolean saveData(@RequestPart(value = "field1") String field1, @RequestPart(value = "field2") String field2, @RequestParam(value = "pdfbytes") String pdfbytes) 
{ 
    System.out.println("saveData: field1=" + field1); 
    System.out.println("saveData: field2=" + field2); 
    System.out.println("saveData: pdfbytes=" + pdfbytes); 
    boolean response = true; 

    return response; 
} 

在前端的編碼,發送使用數據「java.net.HttpURLConnection中的」 看起來是這樣的:

String boundary = MultiPartFormOutputStream.createBoundary(); 

URL uploadDocumentUrl = new URL(protocol + "://" + host + UPLOAD_EDITED_DOCUMENT); 

    HttpURLConnection urlConn = (HttpURLConnection) MultiPartFormOutputStream.createConnection(uploadDocumentUrl); 
    urlConn.setRequestProperty("Content-Type", MultiPartFormOutputStream.getContentType(boundary)); 
    urlConn.setRequestProperty("Connection", "Keep-Alive"); 
    urlConn.setRequestProperty("Cache-Control", "no-cache"); 
    urlConn.setRequestProperty("User-Agent", userAgent); 
    urlConn.setRequestMethod("POST"); 

    MultiPartFormOutputStream out = new MultiPartFormOutputStream(urlConn.getOutputStream(), boundary); 

    String pdfbytes= getEncodedDocument(pdf); 

    out.writeField("field1", field1); 
    out.writeField("field2", field2); 
    out.writeField("pdfbytes", pdfbytes); 

    out.close(); 
    int responseCode = urlConn.getResponseCode(); 
    String responseMessage = urlConn.getResponseMessage(); 

「MultiPartFormOutputStream」是創建通過HttpURLConnection的發送數據的自定義對象,這是非常標準的代碼。我現在確實信任它。

因此,根據我們如何發送數據,是否需要更改控制器來做任何不同的事情,還是看起來不錯?

現在,這裏是代碼,我使用單元測試該控制器:

@Test 
public void testMockUpload() throws Exception 
{ 
    // Load resource being uploaded 
    byte[] pdfbytes = getByteArrayFromFile(FILENAME); 

    MockMultipartFile firstFile = new MockMultipartFile("field1", "", "text/plain", "field1 data".getBytes()); 
    MockMultipartFile secondFile = new MockMultipartFile("field2", "", "text/plain", "field2 data".getBytes()); 
    MockMultipartFile jsonFile = new MockMultipartFile("pdfbytes", "", "text/plain", pdfbytes); 

    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.fileUpload(BASE_URL + "/save").file(firstFile).file(secondFile).file(jsonFile) 
    .with(user(USERNAME).roles("role1", "role2")).contentType(MediaType.MULTIPART_FORM_DATA_VALUE); 

    this.mockMvc.perform(requestBuilder).andDo(print()).andExpect(status().isOk()); 
} 

我也得到返現的錯誤,則: org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException

我正在調查。如果我需要對如何創建我的測試進行任何更改,我對此非常開放。最終,我會讓所有的東西在發送代碼,接收控制器和單元測試之間同步。

提前致謝!像往常一樣,如果有任何其他數據或信息,我可以提供,請讓我知道。謝謝!

回答

0

要上傳一個文件,您需要將RequestParam類型定義爲org.springframework.web.multipart.MultipartFile;

@RequestMapping(value = "/save", method = RequestMethod.POST, produces = "application/json", consumes = "multipart/form-data") 
      public @ResponseBody boolean saveData(@RequestParam(value = "file") MultipartFile file) 
      { 
       return response; 
      } 

多個文件我想嘗試創建一個包裝形式:

public class UploadForm{ 

    private List<MultipartFile> files; 
} 

綁定到該控制器:

@RequestMapping(value = "/save", method = RequestMethod.POST, produces = "application/json", consumes = "multipart/form-data") 
    public @ResponseBody boolean saveData(@ModelAttribute uploadForm) 
    { 
     return response; 
    } 

,然後使用Spring的索引字段的支持綁定到集合:

測試:

MockMultipartFile firstFile = new MockMultipartFile("files[0]", "", "text/plain", "field1 data".getBytes()); 
    MockMultipartFile secondFile = new MockMultipartFile("files[1]", "", "text/plain", "field2 data".getBytes()); 
    MockMultipartFile jsonFile = new MockMultipartFile("files[2]", "", "text/plain", pdfbytes); 

客戶:

out.writeField("files[0]", file1Bytes); 
out.writeField("files[1]", file2Bytes); 
... 
相關問題