2013-11-21 2 views
1

Я пытаюсь использовать <p:fileUpload> для загрузки файла. Вот вид:p: fileUpload вызывает bean-конструктор для каждого файла

<h:form enctype="multipart/form-data"> 
    <p:growl id="messages" showDetail="true" /> 
    <p:fileUpload 
       fileUploadListener="#{viewscopedBean.handleFileUpload}" 
       mode="advanced" dragDropSupport="true" multiple="true" 
       update="messages" /> 
    </h:form> 

Bean:

@ManagedBean 
@ViewScoped 
public class ViewscopedBean implements Serializable{ 
    private List<UploadedFile> uploadedFiles; //to remember which files have been uploaded 

    public ViewscopedBean() { 
      super(); 
      System.out.println("@constructor"); 
      uploadedFiles = new ArrayList<UploadedFile>(); 
    } 

    public void handleFileUpload(FileUploadEvent event) { 
      System.out.println("! HANDLE FILE UPLOAD !"); 
      // do something 
    } 
    public List<UploadedFile> getUploadedFiles() { 
      return uploadedFiles; 
    } 

    public void setUploadedFiles(List<UploadedFile> uploadedFiles) { 
      this.uploadedFiles = uploadedFiles; 
    } 
} 

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>512000</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 

Когда я нажимаю на upload button, то ProgressBar заполняется до 100% (как это делает что-то), но затем страница перезагружается (конструктор вызывается для каждого загруженного файла) - метод handleFileUpload никогда не вызывается.

Нет никаких ошибок или предупреждений, он просто не делает то, что должен. Я имею JSF 2.0 и использую Primefaces 4, может быть, проблема?

Как это вызвано и как я могу его решить?

+1

вы должны иметь, как это на вашей форме, когда вы загрузки файлов '<ч: форма ENCTYPE =«многослойную/форм-данных»>' попробовать, как это будет ли у вас какие-либо удачи – SRy

+0

Привет, да, я уже пробовал это. Я обновлю свой код – Niko

+1

И ваш bean-компонент является 'viewcopedBean'. Можете ли вы показать« полное преобразование бобов »и какую версию' JSF' вы используете? – SRy

ответ

2

Прежде всего убедитесь, что у вас есть commons-fileupload и его зависимость от времени компиляции commons-io на вашем пути к классу. Обработчик, не вызываемый, указывает на то, что эти зависимости отсутствуют.

С 4.0, есть теперь дополнительный контекстно-парам, который указывает на стороне сервера двигатель для обработки FileUpload загрузки:

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

В отсутствие context-param, PrimeFaces противном случае выбирает наиболее подходящий загрузчик двигатель путем обнаружения.

Учитывая, что вы не с использованием JSF 2.2, это означает, что он будет первым выбрать авто, и, следовательно, будет перенаправлять использовать обыкновенные.

Итак, вы можете видеть, насколько важно, что у вас есть commons-fileupload и commons-io в вашем проекте.

Когда я скопировал и вставил ваш код в проект Primefaces 3.5, содержащий эти зависимости, ваш код работал на меня. Конструктор вызывался один раз и только один раз, и метод handle вызывался каждый раз, когда я загружал файл.

Я повторил тест, используя 4.0, и снова конструктор был вызван один раз и только один раз.

Вот конфигурация, которую я использовал в web.xml (необходимы commons-fileupload):

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

Вот основа боб:

package uk; 

import java.util.ArrayList; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

import org.primefaces.event.FileUploadEvent; 
import org.primefaces.model.UploadedFile; 

    @ManagedBean(name = "tempBean") 
    @ViewScoped 
    public class TempBean { 

     private List<UploadedFile> uploadedFiles; //to remember which files have been uploaded 

     public TempBean() { 
       super(); 
       System.out.println("@constructor"); 
       uploadedFiles = new ArrayList<UploadedFile>(); 
     } 

     public void handleFileUpload(FileUploadEvent event) { 
       System.out.println("! HANDLE FILE UPLOAD !"); 
       // do something 
     } 
     public List<UploadedFile> getUploadedFiles() { 
       return uploadedFiles; 
     } 

     public void setUploadedFiles(List<UploadedFile> uploadedFiles) { 
       this.uploadedFiles = uploadedFiles; 
     } 

    } 

Вот страница:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html lang="en" xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 

<h:body> 

    <h:form enctype="multipart/form-data"> 
    <p:growl id="messages" showDetail="true" /> 
    <p:fileUpload 
       fileUploadListener="#{tempBean.handleFileUpload}" 
       mode="advanced" dragDropSupport="true" multiple="true" 
       update="messages" /> 
    </h:form> 
</h:body> 
</html> 

И, наконец, вот фрагмент моего POM, который содержит зависимости и ve rsions для Apache Commons:

<dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-fileupload</groupId> 
     <artifactId>commons-fileupload</artifactId> 
     <version>1.3</version> 
    </dependency> 
+1

привет, большой наконечник; проблема с ajax была решена путем установки простых символов. UPLOADER для общего. Но остается одна проблема: когда я загружаю, например, 3 файла, handleFileUpload работает правильно, но список массивов содержит только одно значение (как и другие два, отбрасываются). ты знаешь почему? – Niko

+0

@Niko прослушиватель вызывается один раз за каждый загруженный файл. – 8bitjunkie

+1

yep, thats true. но почему список содержит только одно значение, когда я загружаю три файла (handleupload вызывается 3 раза)? это вопрос ajax, что он теряет свое состояние? – Niko