1

In my project I have a page where there is a button named "Create Package" that opens a dialog. Within the dialog the user can upload one or more files, and, if he does a mistake, he can delete the previously associated file(s).

I have some issues with the p:upload component, that I will list below.

1) If I specify the h:form without the enctype="multipart/form-data" parameter, the file association works fine, butI obtain the following error when trying to delete the file:

WARNING: javax.servlet.ServletException: org.apache.tomcat.util.http.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header is application/x-www-form-urlencoded
javax.faces.FacesException: javax.servlet.ServletException: org.apache.tomcat.util.http.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header is application/x-www-form-urlencoded
  at org.primefaces.component.fileupload.NativeFileUploadDecoder.decode(NativeFileUploadDecoder.java:44)
  at org.primefaces.component.fileupload.FileUploadRenderer.decode(FileUploadRenderer.java:44)
  at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:831)
...
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/sism_webapp] threw exception [org.apache.tomcat.util.http.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header is application/x-www-form-urlencoded] with root cause
org.apache.tomcat.util.http.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header is application/x-www-form-urlencoded
  at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:806)
  at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:261)
  at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:285)
  at org.apache.catalina.connector.Request.parseParts(Request.java:2722)

2) The same behaviour occurs adding the enctype="multipart/form-data" property only.

3) If I add the following property to the delete button:

onclick="$('#frm_creaDocumenti\\:fu_upload').('disabled','disabled');"

the delete action performs correctly, but the dialog closes automatically.

Is there a solution to perform the document deletion AND maintain the dialog opened?

Environment: Primefaces 4.0, Tomcat 7.0.40

XHTML page

<p:growl id="growl" showDetails="true" />

<p:commandButton id="btn_crea" value="CREA" 
  onclick="PF('creaPackage').show()" type="button" />

<p:dialog id="dlg_crea" header="Crea Package"
  widgetVar="creaPackage" width="95%" position="top"
  modal="true" hideEffect="fade" dynamic="true">

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

    <p:fileUpload id="fu_upload" value="#{packageBean.fileUpload}" 
      widgetVar="wv_upload"
        uploadLabel="ASSOCIA" label="SCEGLI FILE" cancelLabel="ANNULLA SCELTA" 
      update="@form :growl"
      fileUploadListener="#{packageBean.associaDocumentoCrea}" 
      process="@form"   mode="advanced" sizeLimit="1000000">
      </p:fileUpload>

    <!-- onclick="$('#frm_creaDocumenti\\:fu_upload').('disabled','disabled');" -->
    <p:commandButton id="deleteDocumentButton" 
      ajax="true" value="Elimina" 
      actionListener="#{packageBean.eliminaDocumenti('CREA')}" 
      update=":growl" />

    <p:dataTable id="documentTable" var="doc" value="#{packageBean.documenti}" rowKey="#{doc.id}"
      scrollable="true" scrollHeight="270" 
      selection="#{packageBean.documentiSelezionati}" selectionMode="multiple">
      <p:ajax event="rowSelect" listener="#{packageBean.onRowSelect}" update="@this" />
      <p:column headerText="Codice">#{doc.codice}</p:column>
      <p:column headerText="Titolo">#{doc.titolo}</p:column>
      <p:column headerText="Autore">#{doc.autore}</p:column>
    </p:dataTable>
  </h:form>
</p:dialog>

Managed Bean

public void associaDocumentoCrea(FileUploadEvent event)
{
  // call "write file" procedure...
}

public void eliminaDocumenti(String azione)
{
  // call "delete file" procedure...
}

web.xml

<!--
According to the Primefaces User Guide, I do not need to set filter 
and filter-mapping for the file upload if I use "auto"
-->
<context-param>
  <param-name>primefaces.UPLOADER</param-name>
  <param-value>auto</param-value>
</context-param>

pom.xml

<!--
I added the following Maven dependencies to let the file upload 
component work
-->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-io</artifactId>
  <version>1.3.2</version>
</dependency>
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.2.2</version>
</dependency>
ramo102
  • 505
  • 3
  • 9
  • 23

0 Answers0