Как использовать HttpServletRequest # getParts () в фильтре сервлета, работающем на Tomcat? - PullRequest
10 голосов
/ 08 ноября 2011

Я хотел бы загрузить файл в моем приложении JSF.Я использую Filter и HttpServletRequestWrapper для доступа к загружаемому файлу.

 public MultipartRequestWrapper(HttpServletRequest request) {
    super(request);
    System.out.println("Created multipart wrapper....");
    try {
        System.out.println("Looping parts"+getParts().size());

        for (Part p : getParts()) {
            System.out.println(String.format("Part name: %1$s, contentType : %2$s", p.getName(), p.getContentType()));
            for(String header : p.getHeaderNames()){
                System.out.println("Header name : " + header + ", value : " + p.getHeader(header));
            }
            byte[] b = new byte[(int) p.getSize()];
            p.getInputStream().read(b);
            params.put(p.getName(), new String[]{new String(b)});
        }
    } catch (IOException ex) {
        ex.printStackTrace();
        Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ServletException ex) {
         ex.printStackTrace();
        Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
    }

Однако getParts() возвращает пустую коллекцию.Как включить синтаксический анализ multipart/form-data в фильтре сервлетов в Tomcat 7.0.8?

Ответы [ 2 ]

29 голосов
/ 08 ноября 2011

Чтобы заставить HttpServletRequest#getParts() работать в Filter в Tomcat, необходимо установить allowCasualMultipartParsing="true" в веб-приложении <Context> элемент в Webapp/META-INF/context.xml или Tomcat/conf/server.xml.

<Context ... allowCasualMultipartParsing="true">

Поскольку согласно спецификации сервлета 3.0, HttpServletRequest#getParts() должен быть доступен только внутри HttpServlet с аннотацией @MultipartConfig. См. Также документацию элемента <Context>:

allowCasualMultipartParsing

Установите на true, если Tomcat должен автоматически анализировать multipart/form-data тел запроса при вызове HttpServletRequest.getPart* или HttpServletRequest.getParameter*, даже когда целевой сервлет не помечен аннотацией @MultipartConfig (см. Спецификация сервлета 3.0, Раздел 3.2 для деталей). Обратите внимание, что любой параметр, кроме false, приводит к тому, что Tomcat ведет себя не технически совместимым образом. По умолчанию false.

Смотри также:


Не имеет отношения к конкретной проблеме, следующее определенно не верно:

byte[] b = new byte[(int) p.getSize()];
p.getInputStream().read(b);
params.put(p.getName(), new String[]{new String(b)});

Во-первых, вы не соблюдаете кодировку символов, указанную клиентом. Во-вторых, это не удастся для двоичных файлов.

0 голосов
/ 14 ноября 2014

Также попробуйте фильтр Multipart.работал для меня.

<filter>
    <filter-name>MultipartFilter</filter-name>
    <filter-class>org.eclipse.jetty.servlets.MultiPartFilter</filter-class>
</filter> 
<filter-mapping>
    <filter-name>MultipartFilter</filter-name>
    <servlet-name>CamelServlet</servlet-name> 
</filter-mapping>
...