【问题标题】:Primefaces fileupload works only for the first file to be uploadedPrimefaces fileupload 仅适用于要上传的第一个文件
【发布时间】:2023-03-19 02:49:01
【问题描述】:

我正在使用 Primefaces,但文件上传器有问题。问题是它适用于我上传的第一个文件(调用 fileUploadListener 并且 java 方法上传文件),但是如果我尝试上传另一个文件,则不再调用侦听器并且永远不会触发 java 方法.如果我刷新页面,我可以上传另一个文件,但如果我再次尝试上传第二个文件,同样的事情会发生。

xhtml 文件中的代码:

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

java bean 文件中的代码:

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);
   }

}

web.xml 文件中的代码:

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

【问题讨论】:

  • 我忘了说我使用的是 primefaces 3.3.1 和 tomcat 7
  • 您是否尝试在上传后更新整个表单而不仅仅是消息?
  • 感谢您的回复!这不是更新问题,而是与 Ajax 无法正常工作相关的一些问题。 java 方法由 fileUploadListener 仅针对要上传的第一个文件调用,但在那之后,如果我尝试使用第二个文件则不会。 ???
  • 您的 handleFileUpload 方法肯定有效。您的 p:tab 标签周围有另一个表单标签吗? patientHandlerAction 的作用域是什么?
  • 我在 p:tab 周围没有其他表单标签,但是我有很多 p:tabs 并且在每个标签内我都使用一个表单。我正在使用的 bean 具有范围会话。我已经通过使用 iFrame (p:lightBox) 来显示 uploadFile 来解决这个问题,它是一个具有单个表单的页面,对我来说效果很好。

标签: spring jsf file-upload primefaces web.xml


【解决方案1】:

我补充说:

event.getComponent().setTransient(false);

内部文件上传监听方法,

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

一切正常。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我在这里找到了解决方案(比解决方案更多的解决方法):

    http://code.google.com/p/primefaces/issues/detail?id=6157

    FileUpload 组件中的 isTransient() 方法似乎有问题。 希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      我想我找到了问题所在,但我不确定是什么导致了这个问题。 我用来显示 fileUpload 组件的 xhtml 页面有许多选项卡,每个选项卡都有自己的 h:form。我创建了一个只有一个表单的新页面,并且 fileUpload 组件似乎在那里工作正常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 2013-06-06
        • 2017-11-30
        相关资源
        最近更新 更多