Загрузка файлов не работает с PrimeFaces 4.0, PrettyFaces 3.3.3 и GlassFish 4

Я пытался использовать p:fileUpload, но метод fileUploadListener не вызывался и не генерировалось никаких исключений. Без PrettyFaces загрузка файлов работает нормально.

После некоторых исследований я обнаружил, что часто задаваемые вопросы по переписыванию (http://ocpsoft.org/rewrite/docs/faq) ответ на вопрос "Почему загрузка файлов больше не работает корректно?" может быть решением, но проверено только на Tomcat. Я пробовал это на GlassFish, но безуспешно.

Затем я нашел сообщение на форуме OcpSoft, которое решает мою проблему: http://ocpsoft.org/support/topic/pretty-primefaces-fileupload/page/2/#post-25781. Просто поместите код загрузки файла в другой источник страницы и укажите ссылку на него с помощью HTML-тега iframe.

Хорошо, проблема решена, но меня не устраивает решение iframe, тогда как метод fileUploadListener следует вызывать без обходного пути. Итак, кто-нибудь знает, как настроить так, чтобы загрузка файлов работала с PrettyFaces?

Зависимости Maven:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>4.0</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.1</version>
</dependency>

<dependency>
    <groupId>com.ocpsoft</groupId>
    <artifactId>prettyfaces-jsf2</artifactId>
    <version>3.3.3</version>
</dependency>

Исходный код Xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui">

    <h:head></h:head>

    <h:body>

        <h:form>
            <p:fileUpload fileUploadListener="#{fileUploadMB.handleFileUpload}" auto="true"
                update="fileName" />

            <h:outputText id="fileName" value="#{fileUploadMB.uploadedFileName}" />
        </h:form>
    </h:body>

</html>

Управляемый компонент:

@ManagedBean
@ViewScoped
@URLMapping(pattern = "/index", viewId = "/index.xhtml")
public class FileUploadMB {

    private UploadedFile uploadedFile;
    private String uploadedFileName;

    public void handleFileUpload(FileUploadEvent evt) {
        this.uploadedFile = evt.getFile();
        this.uploadedFileName = evt.getFile().getFileName();
    }


    public String getUploadedFileName() {
        return uploadedFileName;
    }


    public void setUploadedFileName(String uploadedFileName) {
        this.uploadedFileName = uploadedFileName;
    }
}

И web.xml:

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

<context-param>
    <param-name>com.ocpsoft.pretty.BASE_PACKAGES</param-name>
    <param-value>
        <!-- Packages with @URLMapping annotation from PrettyFaces -->
        br.nti.ufms
    </param-value>
</context-param>
<context-param>
    <param-name>com.ocpsoft.pretty.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>primefaces.UPLOADER</param-name>
    <param-value>commons</param-value>
</context-param>

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

person Renato Herebia    schedule 10.02.2014    source источник


Ответы (2)


Вероятно, это проблема цепочки фильтров. Попробуйте добавить в фильтры реестра следующее:

<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>

Дополнительную информацию см. в вопросе часто задаваемых вопросов prettyfaces 2.

person Daniel Teleginski Camargo    schedule 10.02.2014
comment
Работает ли это для загрузки файлов размером более 2-3 МБ? - person Rajat Gupta; 16.02.2015

У меня тоже не работало с Primefaces 5.0 и Prettyfaces Rewrite 2.0.12-final на Tomcat 7.0.41.

Но после того, как я удалил эту часть из моего web.xml

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>
        org.primefaces.webapp.filter.FileUploadFilter
    </filter-class>
    <init-param>
        <param-name>thresholdSize</param-name>
        <param-value>51200000</param-value>
    </init-param>
    <init-param>
        <param-name>uploadDirectory</param-name>
        <param-value>/uploadedFilesDirectoryForGlassfish</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

и добавил к context.xml это:

<Context allowCasualMultipartParsing="true">

p:fileUpload также начал нормально работать с переписанными URL-адресами.

Это страница может оказаться полезной.

См. также: http://www.ocpsoft.org/rewrite/docs/faq & этот ТАК ответ


Но подождите,

Только что заметил, что он работает только для загрузки небольших файлов, для загрузки больших файлов слушатель fileUpload все еще не запускается. Кто-нибудь с решениями?

person Rajat Gupta    schedule 16.02.2015