2013-11-21 31 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> 

豆:

@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,進度條被填滿至100%(像它的東西),但是然後頁面被重新加載(每個上傳的文件都會調用構造函數) - handleFileUpload方法從不被調用。

沒有任何錯誤或警告,它只是沒有做它應該做的。我有JSF 2.0並使用Primefaces 4,也許有問題?

這是怎麼造成的,我該怎麼解決呢?

+1

你必須有你這樣的表格上,當你的文件上傳''嘗試這樣你是否有任何運氣 – SRy

+0

嗨,是的,我已經試過了。我將更新我的代碼 – Niko

+1

而你的bean是'viewscopedBean',你能顯示'整個bean decleration'和你使用的是什麼版本的'JSF'? – SRy

回答

2

首先要確保您的類路徑上有commons-fileupload及其編譯時依賴項commons-io。未被調用的處理程序表明您缺少這些依賴關係。

由於4.0,現在有一個可選的context-param指定服務器端引擎,用於處理文件上傳上傳:

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

在沒有context-param的,PrimeFaces否則選擇最適當的載引擎通過檢測。

既然你是使用JSF 2.2,這意味着它會首先選擇汽車,因此將重定向到使用公共

所以你可以看到你有多少重要的是你的項目中有commons-fileuploadcommons-io

當我將您的代碼複製並粘貼到包含這些依賴關係的Primefaces 3.5項目中時,您的代碼適合我。構造函數只被調用一次,每次上傳文件時都會調用句柄方法。

我使用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> 

這裏的支持bean:

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對於Apache的百科全書rsions:

<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

嗨,很棒的提示;通過設置primefaces.UPLOADER來解決ajax的問題​​。但是有一個問題仍然存在:當我上傳例如3個文件,handleFileUpload可以正常工作,但數組列表只包含一個值(就像其他兩個被丟棄)。你知道爲什麼嗎? – Niko

+0

@Niko聽衆每上傳一個文件就會被調用一次。 – 8bitjunkie

+1

是的,那是真的。但爲什麼列表只包含一個值,當我上傳三個文件(handleupload被調用3次)?這是一個阿賈克斯問題,它失去了它的狀態? – Niko