2013-03-27 53 views
4

我想用primefaces上傳圖像,並且不會調用fileUploadListener。p:fileUpload中的監聽器方法永遠不會在primefaces中調用

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

     <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}" 
     mode="advanced" 
     update="messages" 
     sizeLimit="100000" 
     allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/> 

<p:growl id="messages" showDetail="true"/> 

這裏是bean:

@ManagedBean 
@RequestScoped 
public class FileUploadController { 
    public void handleFileUpload(FileUploadEvent event) throws Exception { 
     System.out.println("OOOOOOOOOOOOOOOOOOK"); 
      File targetFolder = new File("C:/Uploads"); 
      InputStream inputStream = event.getFile().getInputstream(); 
      OutputStream out = new FileOutputStream(new File(targetFolder, 
        event.getFile().getFileName())); 
      int read = 0; 
      byte[] bytes = new byte[1024]; 

      while ((read = inputStream.read(bytes)) != -1) { 
       out.write(bytes, 0, read); 
      } 
      inputStream.close(); 
      out.flush(); 
      out.close(); 

    } 
} 

這裏是web.xml配置:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
<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> 
<dispatcher>FORWARD</dispatcher> 
</filter-mapping> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <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>/faces/*</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 
</web-app> 

我還添加了公共資源,文件上傳和Commons- io在classpath中加入jar。 我不明白爲什麼不調用handleFileUpload。

回答

5

您已經明確地配置了文件上傳過濾器,僅在FORWARD調度程序上進行監聽。

你需要要麼刪除從過濾器映射以下項,以便在默認監聽僅在REQUEST調度員:

<dispatcher>FORWARD</dispatcher> 

或者,添加REQUEST調度員的過濾器映射以便它可以按照正常請求運行:

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

FORWARD調度程序是唯一的當RequestDispatcher#forward()在之前被稱爲時,強制過濾器被調用。例如,通過某些URL重寫解決方案(如PrettyFaces)。然而,在問題中提供的信息似乎並不表示您正在使用該信息。


無關的具體問題,因爲PrimeFaces文件上傳需要Apache下議院IO,你可能要考慮到IOUtils#copy()的而不是冗長的輸入/輸出流循環。另見:How to save uploaded file in JSF

+0

謝謝你,你真棒! – shark33 2013-03-27 12:53:41

+0

不客氣。 – BalusC 2013-03-27 13:00:18

相關問題