2013-11-21 2 views
1

<p:fileUpload>을 사용하여 파일을 업로드하려고합니다.p : fileUpload가 각 파일의 빈 생성자를 호출합니다.

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

콩 : 다음은 뷰의 나는 upload button을 클릭하면 진행 막대가 100 % (이하는 것처럼 일을) 채우고있다

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

는, 그런 다음 페이지가 다시로드됩니다 (생성자가 업로드 된 모든 파일에 대해 호출 됨) - handleFileUpload 메소드는 호출되지 않습니다.

오류나 경고가 없으며 단지 필요한 것을 수행하지 않습니다. JSF 2.0을 사용하고 Primefaces 4를 사용합니다. 문제가있을 수 있습니까?

어떻게 이것이 발생하며 어떻게 해결할 수 있습니까?

+1

당신은 업로드를'파일 않는 경우 양식에 다음과 같이 있어야 – SRy

+0

안녕하세요, 저는 이미 그것을 시도했습니다. 나는 코드를 갱신 할 것이다 – Niko

+1

그리고 당신의 bean은'viewscopedBean'이다.'전체 bean decleration'과'JSF'의 어떤 버전을 사용할 수 있습니까? – SRy

답변

2

첫 번째 사항은 클래스 경로에 이고 컴파일 시간 종속은 commons-io이어야합니다. 호출되지 않는 핸들러는 이러한 종속성이 누락되었음을 나타냅니다.

4.0 때문에, 현재는 FileUpload 업로드를 처리하기위한 서버 측 엔진을 지정하는 선택적 상황 PARAM가 다음 context-param의 부재

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

를 PrimeFaces 그렇지 않으면 가장 적절한 로더를 선택 검출에 의한 엔진.

당신이 JSF 2.2 사용 하지 것을 감안할 때, 이것은 처음 자동을 선택합니다, 따라서 공유지를 사용하여 리디렉션을 의미합니다.

따라서 프로젝트에 commons-fileuploadcommons-io이 얼마나 중요한지 알 수 있습니다.

이러한 종속성을 포함하는 Primefaces 3.5 프로젝트에 코드를 복사하여 붙여 넣으면 코드가 올바르게 작동했습니다. 생성자는 한 번만 호출되었으며 핸들 메서드는 파일을 업로드 할 때마다 호출되었습니다.

4.0을 사용하여 테스트를 반복했고, 생성자를 한 번만 호출했습니다.페이지 여기

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> 

그리고 마지막으로 여기

<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-fileupload 필요로) 내가 web.xml에 사용되는 구성입니다 여기에 의존성을 포함하는 내 POM의 발췌 문장이 있습니다. 아파치 코 몬즈에 대한 rsions는`: <폼에 enctype = "다중/폼 데이터"H> 당신이 어떤 행운을해야합니다 여부를 다음과 같이 시도

<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의 문제점은 primefaces.UPLOADER를 공통으로 설정하여 해결되었습니다. 하지만 한 가지 문제가 남아 있습니다. 3 파일의 경우 handleFileUpload는 올바르게 작동하지만 배열 목록에는 하나의 값만 포함됩니다 (다른 두 개는 무시됩니다). 왜 그런지 알아? – Niko

+0

@Niko 리스너는 업로드 된 파일 당 한 번 호출됩니다. – 8bitjunkie

+1

네. 사실입니다. 하지만 세 개의 파일을 업로드 할 때 목록에 하나의 값만 들어있는 이유는 무엇입니까 (handleupload는 3 번 호출됩니다)? 이 상태가 아약스 문제일까요? – Niko

관련 문제