3

私は Primefaces を使用していますが、ファイルアップローダーに問題があります。問題は、アップロードする最初のファイル (fileUploadListener が呼び出され、Java メソッドがファイルをアップロードする) では正常に動作することですが、別のファイルをアップロードしようとすると、リスナーが呼び出されなくなり、Java メソッドがトリガーされないことです。 . ページを更新すると、別のファイルをアップロードできますが、2 番目のファイルをアップロードしようとすると、同じことが起こります。

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

3 に答える 3

1

私は同じ問題を抱えていて、ここで解決策(解決策よりも回避策)を見つけました:

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

FileUploadコンポーネントのisTransient()メソッドに問題があるようです。それが役に立てば幸い。

于 2014-02-24T13:42:36.660 に答える
0

何が悪いのかはわかったと思いますが、何がこの問題を引き起こしているのかわかりません。fileUploadコンポーネントを表示するために使用するxhtmlページには多くのタブがあり、各タブには独自のh:formがあります。フォームが1つしかない新しいページを作成しましたが、fileUploadコンポーネントはそこで正常に機能しているようです。

于 2012-08-24T09:18:06.293 に答える