2012-01-29 9 views
7

Mam dość prostą aplikację JSP/Servlet 3.0/Spring MVC 3.1.Jak zmienić kodowanie znaków dla formularzy przesyłania wieloczęściowego MVC w Servlet 3.0 Spring?

Na jednej z moich stron mam wiele formularzy. Jeden z tych formularzy pozwala użytkownikowi przesłać plik, a zatem jest skonfigurowany pod numerem enctype="multipart/form-data". Skonfigurowałem wieloczęściowy upload w pliku web.xml z elementem multipart-config, który jest dostępny od Servlet 3.0, w połączeniu z <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/> w mojej konfiguracji sprężynowej.

Mam również skonfigurowany Spring org.springframework.web.filter.CharacterEncodingFilter.

Problem polega na tym, że nie mogę znaleźć sposobu na ustawienie domyślnego kodowania StandardServletMultipartResolver na kodowanie UTF-8, co często powoduje, że zawartość pól tekstowych w formularzu wieloczęściowym jest zniekształcona.

Czy można to naprawić?

Z góry dziękuję.

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

Jestem również stoi problem ... Czy można znaleźć rozwiązanie tego problemu? – hanumant

+0

Tak, skończyłem wyrzucać konfigurację Servlet 3.0 i poszedłem z normalnymi metodami przesyłania plików, jak wyjaśniono tutaj [link] (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/ mvc.html # mvc-multipart) – Mopper

Odpowiedz

10

Ponieważ nie znalazłem sposób ustawić domyślne kodowanie używając StandardMultipartResolver, Rzuciłam config aplet 3.0 i udał się do starego dobrego CommonsMultipartResolver.

skonfigurowałem go tak jak to w moim wiosennym kontekstu serwletu:

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

W końcu nie ma wielkiej różnicy, gdyż pod maską StandardMultipartResolver, to właśnie delegatów CommonsMultipartResolver.

Rzeczywiście, podejście serwletu 3.0 jest bardziej kłopotliwe, ponieważ wymaga konfiguracji zarówno w web.xml, jak i w kontekście serwletu, i utracisz możliwość ustawienia domyślnego kodowania.

1

Wystąpił również problem z kodowaniem podczas korzystania z API Servlet 3. Po pewnych badaniach odkryłem, że w Tomcat 7 jest błąd, który powoduje, że parametry nie są odczytywane z poprawnym kodowaniem w pewnych warunkach. Istnieje obejście. Po pierwsze, trzeba powiedzieć, który jest w rzeczywistości kodowania (jeśli nie jest domyślnie ISO-8859-1):

request.setCharacterEncoding("UTF-8"); 

To jest w zasadzie to, co CharacterEncodingFilter wiosną robi. Nic dziwnego do tej pory. Teraz sztuczka. Nazywamy to:

request.getParameterNames() 

Upewnij się, ta metoda jest wywoływana przed getParts(). Jeśli używasz Springa, domyślam się, że musisz to zrobić w filtrze, zanim wniosek zakończy się na wiosnę. Niezwykle ważna jest kolejność wywoływania metod.

Aktualizacja:Tomcat bug has been fixed w 7.0.41 roku, więc jeśli używasz najnowszej wersji Tomcat tylko trzeba ustawić kodowanie znaków, aby uzyskać prawidłowy wynik.

1

tworzę własny filtr wieloczęściowy jak holmis83 zasugerował, i działało dobrze

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

Działa w celu ustalenia kodowania strony na serwerze Tomcat, który ma problem, myślę, że działa w moim przypadku, ale w przypadku pliku wieloczęściowego Poprawka Moppera jest poprawna. dzięki – gasser

Powiązane problemy