2012-01-29 6 views
7

Ho una semplice applicazione JSP/Servlet 3.0/Spring MVC 3.1.Come modificare la codifica dei caratteri per i moduli di caricamento multipart di Spring MVC Servlet 3.0?

In una delle mie pagine, ho più moduli. Uno di questi moduli consente all'utente di caricare un file e viene quindi configurato con enctype="multipart/form-data". Ho configurato il caricamento multipart nel file web.xml con l'elemento multipart-config disponibile dal Servlet 3.0, combinato con <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/> nella mia configurazione di primavera.

Ho anche Spring org.springframework.web.filter.CharacterEncodingFilter configurato.

Il problema che ho è che non riesco a trovare un modo per impostare la codifica predefinita di StandardServletMultipartResolver su UTF-8, che spesso fa in modo che tutto il contenuto dei campi di testo nel modulo multipart sia tutto confuso.

C'è un modo per risolvere questo problema?

Grazie in anticipo.

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

sto affrontando anche il problema ... hai trovato la soluzione a questo problema? – hanumant

+0

Sì, ho finito con il dumping della configurazione di Servlet 3.0 e sono andato con il normale approccio di commons-upload come spiegato qui [collegamento] (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/ mvc.html # mvc-multipart) – Mopper

risposta

10

Da quando ho trovato alcun modo per impostare la codifica di default utilizzando il StandardMultipartResolver, ho scaricato la configurazione servlet 3.0 ed è andato per il buon vecchio CommonsMultipartResolver.

ho configurato come questo nel mio contesto servlet primavera:

<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> 

Alla fine, non c'è molta differenza, dal momento che sotto il cofano della StandardMultipartResolver, esso solo ai delegati di CommonsMultipartResolver.

In realtà trovo l'approccio del servlet 3.0 più problematico, poiché richiede la configurazione sia in web.xml che nel contesto del servlet, e si perde la possibilità di impostare la codifica predefinita.

1

Ho anche avuto il problema con la codifica quando si utilizza l'API Servlet 3. Dopo alcune ricerche, ho scoperto che c'è un bug in Tomcat 7 che rende i parametri da non leggere con la codifica corretta in determinate condizioni. C'è un work-around. In primo luogo, è necessario dire che la codifica non sia in realtà (se non è di default iso-8859-1):

request.setCharacterEncoding("UTF-8"); 

Questo è fondamentalmente ciò che il CharacterEncodingFilter in primavera fa. Niente di strano finora. Ora il trucco. Chiama questo:

request.getParameterNames() 

assicurarsi che questo metodo viene invocato prima getParts(). Se stai usando Spring, suppongo che devi farlo in un filtro prima che la richiesta finisca in primavera. L'ordine con cui i metodi sono invocati è cruciale.

Update: Il Tomcat bug has been fixed in 7.0.41 in poi, quindi se si utilizza una versione recente di Tomcat è sufficiente impostare la codifica dei caratteri per ottenere il risultato corretto.

1

ho creato il mio filtro in più parti come holmis83 suggerito, e funzionava bene

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

Funziona per risolvere la codifica della pagina sul server Tomcat che ha un problema, credo che funzioni sul mio caso ma per il file multipart la correzione di Mopper è quella corretta. Grazie – gasser

Problemi correlati