Обработчик загрузки файлов Primefaces 4 не вызывается

Прежде всего, я должен сказать, что я прочитал все (по крайней мере, много :)) вопросов здесь и на форумах Primefaces о проблемах с файловыми загрузчиками.

Моя конфигурация:

Праймфейс 4

JSF 2.2

Весна

Apache Tomcat 7

Мейвен

Я конвертирую проект Richfaces в Primefaces, и я застрял с компонентом fileUpload, который не вызывает метод обработчика.

Я пробовал (хотя знаю, что с Primefaces 4 в этом нет необходимости) ставить фильтры в web.xml. Я также пробовал без фильтров. Среди прочего у меня есть пружинные фильтры безопасности и языковой фильтр, но PF был первым. Я также попытался установить диспетчер на FORWARD.

У меня есть все нужные зависимости в Maven (commons - знаю, что с 4 версии не требуется, но тем не менее пробовал)

Часть xhtml:

<h:form enctype="multipart/form-data">

        ... /* not relevant code here */ ...

                            <p:graphicImage value="#{systemParamsController.image}"
                                id="logo" />

                            <p:fileUpload
                                fileUploadListener="#{systemParamsController.listener}"
                                fileLimit="1" allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                                uploadLabel="#{msg['button.upload.jpg']}"
                                cancelLabel="#{msg['button.cancel']}"
                                invalidFileMessage="alert('#{msg['upload.invalidtype']}');"
                                update="logo" mode="advanced">
                            </p:fileUpload>
                            <p:growl id="messages" showDetail="true" />
                        </h:panelGrid>
                    </h:panelGroup>
                    <p:commandButton value="#{msg['button.save']}" onclick="this.disabled=true"  oncomplete="this.disabled=false"
                        action="#{systemParamsController.save}" styleClass="qs-button"
                        ajax="false" />
                </h:panelGrid>
            </p:panel>
        </center>
    </h:form>

Поддерживающий компонент:

public synchronized void listener(FileUploadEvent event) throws Exception {
  logger.debug("uploadListener!");
  UploadedFile item = event.getFile();
  getModel().getCustomer().setLogo(imageResizer.doResize(item.getContents(), 30, Side.HEIGHT));
}

Если я нажму «Выбрать», я могу выбрать файл, но после этого ничего не происходит. Обработчик не вызывается, т. к. сообщения в логе нет, кнопка загрузки файла неактивна. Я использовал этот компонент раньше для более сложных задач без проблем, поэтому я уверен, что упускаю что-то очевидное.

Заранее спасибо за любую помощь!


person omniflash    schedule 08.01.2014    source источник
comment
Откройте вашу любимую консоль Javascript... выдает ли она какую-либо значимую ошибку? Какова сфера вашей поддержки bean?   -  person elbuild    schedule 08.01.2014
comment
:) Не могу выразить свою благодарность за подсказку консоли js... В замещенном тексте в invalidFileMessage была синтаксическая ошибка... Большое спасибо!   -  person omniflash    schedule 08.01.2014


Ответы (1)


Убедитесь, что у вас есть фильтр PrimeFaces FileUpload в качестве первого фильтра в вашем web.xml:

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

Если у вас возникли проблемы с загрузчиком простых лиц по умолчанию, вы можете попробовать загрузить файл commons:

<context-param>
    <param-name>primefaces.UPLOADER</param-name>
    <param-value>commons</param-value>
</context-param>

Мы используем эту зависимость Maven:

<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.1</version>
</dependency>

Кроме того, попробуйте поместить загрузку файла в его собственную форму.

person awilkinson    schedule 18.09.2015