2012-01-29 7 views
7

मेरे पास एक बहुत ही सरल जेएसपी/सर्वलेट 3.0/स्प्रिंग एमवीसी 3.1 एप्लिकेशन है।सर्वलेट 3.0 स्प्रिंग एमवीसी मल्टीपार्ट अपलोड फॉर्म के लिए वर्ण एन्कोडिंग कैसे बदलें?

मेरे पृष्ठों में से एक पर, मेरे पास कई रूप हैं। इन रूपों में से एक उपयोगकर्ता को फ़ाइल अपलोड करने की अनुमति देता है और इस प्रकार enctype="multipart/form-data" के साथ कॉन्फ़िगर किया जाता है। मैंने web.xml फ़ाइल में मल्टीपार्ट अपलोड को multipart-config तत्व के साथ कॉन्फ़िगर किया है जो सर्वलेट 3.0 के बाद उपलब्ध है, जो मेरे वसंत विन्यास में <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/> के साथ संयुक्त है।

मेरे पास स्प्रिंग का org.springframework.web.filter.CharacterEncodingFilter कॉन्फ़िगर किया गया है।

मेरी समस्या यह है कि मुझे मानक सर्वलेट मल्टीपार्ट रीसोल्वर के डिफ़ॉल्ट एन्कोडिंग को यूटीएफ -8 में सेट करने का कोई तरीका नहीं मिल रहा है, जो अक्सर मल्टीपार्ट फॉर्म में टेक्स्टफील्ड की सामग्री को सभी गड़बड़ कर देता है।

क्या इसे ठीक करने का कोई तरीका है?

अग्रिम धन्यवाद।

web.xml config:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0"> 
<display-name>foo-web</display-name> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     WEB-INF\applicationContext.xml 
    </param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>foo</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>0</load-on-startup> 
    <multipart-config> 
     <max-file-size>52428800</max-file-size> 
     <file-size-threshold>5242880</file-size-threshold> 
    </multipart-config> 
</servlet> 
<servlet-mapping> 
    <servlet-name>foo</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<welcome-file-list> 
    <welcome-file>login</welcome-file> 
</welcome-file-list> 

+0

मैं भी मुद्दे का सामना करना पड़ रहा हूँ ... आप इस समस्या का समाधान मिला? – hanumant

+0

हां मैंने सर्वलेट 3.0 कॉन्फ़िगरेशन को डंप कर दिया और सामान्य कॉमन्स-अपलोड दृष्टिकोण के साथ चला गया जैसा कि यहां बताया गया है [लिंक] (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/ mvc.html # mvc-multipart) – Mopper

उत्तर

10

जब से मैं डिफ़ॉल्ट StandardMultipartResolver का उपयोग कर एन्कोडिंग सेट करने के लिए कोई रास्ता नहीं मिला, मैं सर्वलेट 3.0 config फेंक दिया और अच्छे पुराने CommonsMultipartResolver के लिए चला गया।

मैं अपने वसंत सर्वलेट संदर्भ में इस तरह इसे कॉन्फिगर:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
    <!-- one of the properties available; the maximum file size in bytes --> 
    <property name="maxUploadSize" value="157286400" /> 
    <property name="maxInMemorySize" value="5242880"/> 
    <property name="defaultEncoding" value="utf-8"/> 
</bean> 

अंत में, वहाँ बहुत अंतर CommonsMultipartResolver को StandardMultipartResolver, यह सिर्फ प्रतिनिधियों के हुड के अंतर्गत के बाद से नहीं है,।

मैं वास्तव में, सर्वलेट 3.0 दृष्टिकोण अधिक परेशानी लगता है क्योंकि यह दोनों web.xml और अपने सर्वलेट संदर्भ में विन्यास की आवश्यकता है, और आप डिफ़ॉल्ट एन्कोडिंग निर्धारित करने की क्षमता खो देते हैं।

1

मुझे सर्वलेट 3 एपीआई का उपयोग करते समय एन्कोडिंग में भी समस्या थी। कुछ शोध के बाद, मैंने पाया है कि टॉमकैट 7 में एक बग है जो कुछ स्थितियों के तहत पैरामीटर को सही एन्कोडिंग के साथ पढ़ा नहीं जाता है। एक काम आसपास है। सबसे पहले, आपको बताने के लिए जो यह वास्तव में एन्कोडिंग है (अगर यह डिफ़ॉल्ट नहीं है ISO-8859-1) की जरूरत है:

request.setCharacterEncoding("UTF-8"); 

यह मूलतः क्या वसंत में CharacterEncodingFilter करता है। अभी तक कुछ भी अजीब नहीं है। अब चाल इस कॉल करें:

request.getParameterNames() 

यकीन है कि इस विधि getParts() से पहले लागू किया गया है। आप वसंत का उपयोग कर रहे हैं, तो मैं तुम्हें एक फिल्टर में ऐसा करने से पहले अनुरोध वसंत में समाप्त होता है की जरूरत है लगता है। जिस क्रम तरीकों लागू कर रहे हैं महत्वपूर्ण हैं।

अद्यतन:Tomcat bug has been fixed 7.0.41 में बाद, इसलिए यदि आप बिलाव के हाल के एक संस्करण का उपयोग आप केवल सही परिणाम प्राप्त करने के लिए वर्ण एन्कोडिंग सेट करना होगा।

1

मैं के रूप में holmis83 सुझाव दिया मेरे अपने बहुखण्डीय फिल्टर बनाया है, और ठीक काम किया

public class MyMultiPartFilter extends MultipartFilter { 

    Logger logger = LoggerFactory.getLogger(MyMultiPartFilter.class); 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
      HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 

     request.setCharacterEncoding("UTF-8"); 
     request.getParameterNames(); 

     super.doFilterInternal(request, response, filterChain); 
    } 
} 
+0

यह टॉमकैट सर्वर पर पृष्ठ के एन्कोडिंग को ठीक करने के लिए काम करता है जिसमें समस्या है, मुझे लगता है कि यह मेरे मामले पर काम करता है लेकिन मल्टीपार्ट फ़ाइल के लिए मोपर का फ़िक्स सही है। धन्यवाद – gasser

संबंधित मुद्दे