2012-08-22 44 views
3

我正在使用Primefaces,并且遇到fileuploader问题。问题在于,它对我上传的第一个文件(fileUploadListener被调用并且java方法上传文件)工作正常,但是如果我尝试上传另一个文件,监听器不再被调用,并且java方法从不被触发。如果我刷新页面,我可以上传另一个文件,但如果我尝试上传第二个文件,则会发生同样的情况。在XHTML文件中Primefaces文件上传仅适用于要上传的第一个文件

代码:

<filter> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <filter-class> 
     org.primefaces.webapp.filter.FileUploadFilter 
    </filter-class> 
    <init-param> 
     <param-name>uploadDirectory</param-name> 
     <param-value>/HerEhrUploaded/temp</param-value> 
    </init-param> 
    <init-param> 
     <param-name>thresholdSize</param-name> 
     <param-value>20971520</param-value> 
    </init-param>  
</filter> 

<filter-mapping> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 
:web.xml文件中

public void handleFileUpload(FileUploadEvent event) { 

    ExternalContext extContext=FacesContext.getCurrentInstance().getExternalContext(); 
    String filename = FilenameUtils.getName(event.getFile().getFileName()); 
    File result = new File(extContext.getRealPath("//uploaded//" + filename)); 

    try { 
     FileOutputStream fileOutputStream = new FileOutputStream(result); 

     byte[] buffer = new byte[6124]; 

     int bulk; 
     InputStream inputStream = event.getFile().getInputstream(); 
     while (true) { 
     bulk = inputStream.read(buffer); 
     if (bulk < 0) { 
      break; 
     } 
     fileOutputStream.write(buffer, 0, bulk); 
     fileOutputStream.flush(); 
     } 

     fileOutputStream.close(); 
     inputStream.close(); 

     messageTitle = "Message"; 
     messageBody = "The file" + event.getFile().getFileName() + " was succesfully uploaded!"; 

     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, messageTitle, messageBody)); 

    } 

    catch (IOException e) { 
     e.printStackTrace(); 

     messageTitle = "Message"; 
     messageBody = "The file was not uploaded"; 

     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, messageTitle, messageBody)); 
     FacesMessage error = new FacesMessage(FacesMessage.SEVERITY_ERROR, "The files were not uploaded!", ""); 
     FacesContext.getCurrentInstance().addMessage(null, error); 
    } 

} 

代码:这个Java bean文件中

<p:tab id="eConsentTabPanel" title="Informed Consent" disabled="#{patientHandlerAction.patientTabsStatus}"> 
    <h:form id="eConsentForm" enctype="multipart/form-data"> 
    <h:panelGrid id="eConsentPanelGrid"> 
     <p:fileUpload fileUploadListener="#{patientHandlerAction.handleFileUpload}" 
         mode="advanced" 
         update="messages" 
         multiple="true" 
         auto="true" 
         sizeLimit="20971520" 
         label="Select File" 
         allowTypes="/(\.|\/)(gif|jpe?g|png|pdf|doc?x)$/"/> 
     <p:growl id="messages" showDetail="true"/> 
    </h:panelGrid> 
    </h:form> 
</p:tab> 

代码

+0

我忘了提及我正在使用primefaces 3.3.1和tomcat 7 – Goro

+0

您的handleFileUpload方法绝对有效。你的p:tab标签周围是否还有其他表单标签?什么范围是patientHandlerAction? – StephenMeyer

+0

您是否尝试在上传后更新整个表单而不仅是消息? –

回答

0

我想我已经发现了什么问题,但是我不确定是什么导致了这个问题。 我用来显示fileUpload组件的xhtml页面有许多选项卡,每个选项卡都有它自己的h:表单。我创建了一个只有一个窗体的新页面,并且fileUpload组件似乎在那里工作得很好。

3

我说:

event.getComponent().setTransient(false); 

内部文件上传监听方法,

public void handleUpload(FileUploadEvent event) { 
    .... 
} 

它的正常工作。

相关问题