2013-03-27 52 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

相关问题