2014-05-08 8 views
16

मेरे पास इस तरह का नियंत्रक है और मैं फ़ाइल अपलोड के साथ एक फॉर्म सबमिट करना चाहता हूं साथ ही नीचे दिखाए गए लेबल जैसे कुछ फॉर्म डेटा भी सबमिट करना चाहता हूं। इसके अलावा मैं @RequestBody का उपयोग करके bu में ऐसा करना चाहता हूं, इसलिए मैं रैपर पर @Valid एनोटेशन का उपयोग कर सकता हूं क्योंकि अधिक चर जोड़े जाएंगे।स्प्रिंग कंट्रोलर @RequestBody फ़ाइल अपलोड के साथ यह संभव है?

public @ResponseBody WebResponse<Boolean> updateEUSettings(
    final Locale locale, 
    @Validated @ModelAttribute final EUPSettingsWrapper endUserPortalSettingsWrapper) { 
} 

और मेरे आवरण

public class EUPSettingsWrapper { 

    private String label; 
    private MultipartFile logo; 
// getter , setters..etc... 
} 

है, लेकिन मैं ModelAttrbutes से एक @RequestBody करने के लिए परिवर्तित करना चाहते हैं।

तरह से मैं कोशिश कर रहा हूँ मेरी नकली MVC में इस

public @ResponseBody WebResponse<Boolean> updateEUSettings(
    final Locale locale, 
    @Validated @RequestBody final EUPSettingsWrapper endUserPortalSettingsWrapper, 
    @RequestParam(value = "file1", required = true) final MultipartFile logo) { 

    endUserPortalSettingsWrapper.setLogo(logo); 

    // ... 
} 

की तरह अनुरोध पैरामीटर के रूप में अलग फाइल अपलोड मैं

getMockMvc().perform(fileUpload(uri).file(logo) 
         .accept(MediaType.APPLICATION_JSON) 
         .content(JSONUtils.toJSON(wrapper)) 
         .contentType(MediaType.MULTIPART_FORM_DATA)) 
         .andExpect(status().isOk()); 

की स्थापना कर रहा हूँ, लेकिन मैं इस तरह एक त्रुटि हो रही है होने से है जो

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data' not supported 

किसी के पास एक अच्छा विचार है कि मल्टीपार्ट फ़ाइल अपलोड का उपयोग कैसे किया जा सकता है wi वें @RequestBody। मैं कुछ भी गलत कर रहा हूँ?

उत्तर

22

के लिए निर्भरता को जोड़ने के लिए आप वास्तव में यहाँ अपने जीवन को आसान बनाने में कर सकते हैं के बाद से सभी आप कर रहे हैं एक रूप है कि कुछ क्षेत्रों और फ़ाइल प्रस्तुत करने है मत भूलना। आप को आप जो करने की कोशिश कर रहे हैं उसके लिए @RequestBody की आवश्यकता नहीं है। तुम्हें पता है, नियमित रूप से वसंत MVC सुविधाओं का उपयोग तो अपने नियंत्रक विधि कैसा दिखेगा कर सकते हैं:

@ResponseBody 
public WebResponse<Boolean> updateEUSettings(final Locale locale, @Valid final EUPSettingsWrapper endUserPortalSettingsWrapper, 
              @RequestParam(value = "file1", required = true) final MultipartFile logo) { 


} 

ग्राहक है कि इस नियंत्रक से अनुरोध सबमिट enctype="multipart/form-data" साथ एक फार्म की आवश्यकता होगी।

getMockMvc().perform(fileUpload(uri).file("file1", "some-content".getBytes()) 
         .param("someEuSettingsProperty", "someValue") 
         .param("someOtherEuSettingsProperty", "someOtherValue") 
         .accept(MediaType.APPLICATION_JSON) 
         .contentType(MediaType.MULTIPART_FORM_DATA)) 
         .andExpect(status().isOk()); 
8

मल्टीपार्ट अनुरोध के लिए समर्थन जोड़ने के लिए कृपया अपने वसंत-servlet.xml में निम्न बीन जोड़ें।

<bean id="multipartResolver" 
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> 

इसके अलावा कॉमन्स-fileupload जार

+0

धन्यवाद बहुत सारे प्रयासों को बचाया .. – pratikabu

3

मैं @RequestBody उपयोग करने के लिए एक तरह से नहीं मिल सका:

अपने स्प्रिंग MVC परीक्षण में आप कुछ इस तरह लिखते थे।

हालांकि, अगर आप कुछ इस तरह कर सकते हैं:

@RequestMapping(value = "/uploadStuff", method = RequestMethod.POST) 
public MyViewDto doStuff(@RequestPart("json") @Valid MyDto dto, 
         @RequestPart("file") MultipartFile file) { ... } 

आप इसे इस तरह का परीक्षण कर सकते हैं:

MockMultipartFile jsonFile = new MockMultipartFile("json", "", 
      "application/json", "{}".getBytes()); 
MockMultipartFile dataFile = new MockMultipartFile("file", "foo.zip", "application/octet-stream", bytes); 

mockMvc.perform(fileUpload("/uploadStuff") 
      .file(dataFile) 
      .file(jsonFile)) 
      .andExpect(status().isOk()); 
0

मैं इस के साथ एक छोटे से संघर्ष किया और के रूप में सरल पैरामीटर प्रदान करने के समाप्त हो गया। ठीक है अगर आपके पास आपके अनुरोध में पास करने के लिए बहुत कुछ नहीं है:

myMethod(@RequestParam("file") MultipartFile myFile, 
     @RequestParam("param1") Float param1, @RequestParam("param2") String param2 {} 
संबंधित मुद्दे