You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by pr...@centrum.cz on 2014/04/08 13:13:52 UTC

ExtensionsFilter corrupt xlsx during download

Hi, I'am using tomahawk-1.1.9 and JSF 1.2 for uploading file via t:inputFileUpload. When I add following lines to my web.xml 

        <filter>
            <filter-name>MyFacesExtensionsFilter</filter-name>
            <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
                <init-param>
                        <description>
                            Set the size limit for uploaded files. 
                                Format: 10  - 10 bytes 
                                        10k - 10 KB 
                                        10m - 10 MB 
                                        1g  - 1 GB 
                        </description>
                        <param-name>uploadMaxFileSize</param-name>
                        <param-value>20m</param-value>
                    </init-param>
        </filter>
        <filter-mapping>
            <filter-name>MyFacesExtensionsFilter</filter-name>
          <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
        </filter-mapping>

It starts to corrupt Excel files during download. (When I opening downloaded Excel spreadsheet it reports that it's corrupted and it has to be repaired). In next step it repairs Excel but it's annoying to repair it every time. 

This is my download code.. It's not complete but main parts are contained. 

<h:commandLink value="#{ms['win.list_transcription.prescriptionExportAndDownload']}" actionListener="#{transcriptionBean.downloadExportPrescriptions}" title="#{ms['win.list_transcription.prescriptionExportAndDownload']}"  />

FacesContext fc = FacesContext.getCurrentInstance(); 
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 

response.reset(); 
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); 
response.setContentLength(size); 
response.setContentType(StringUtils.isBlank(contentType) ? DEFAULT_CONTENT_TYPE : contentType); 

OutputStream out = null; 
InputStream input = null; 

try { 
        input = new FileInputStream(file); 

        inputToOutputWriter(input, response, out); 
        } catch (Exception err) { 
                err.printStackTrace(); 
        } finally { 
                if (deleteOnClose) { 
                        file.delete(); 
                } 
} 
fc.responseComplete(); 

I don't know if it's possible to register ExtensionsFilter only for one jsf page (import page). My attempts were not successfull. I tried for example this, but it ends that on import_payments.jsf is no servlet present (no action works). 

        <filter-mapping>
            <filter-name>MyFacesExtensionsFilter</filter-name>
          <servlet-name>Import Faces Servlet</servlet-name>
            <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
        </filter-mapping>
         <servlet>
                <servlet-name>Import Faces Servlet</servlet-name>
                <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
                <servlet-name>Import Faces Servlet</servlet-name>
                <url-pattern>/private/import_payments.jsf</url-pattern>
        </servlet-mapping>
        <servlet>
                <servlet-name>Faces Servlet</servlet-name>
                <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
                <load-on-startup>2</load-on-startup>
        </servlet>
        <servlet-mapping>
                <servlet-name>Faces Servlet</servlet-name>
                <url-pattern>*.jsf</url-pattern>
        </servlet-mapping>

Thank you 
Zdend

Re: ExtensionsFilter corrupt xlsx during download

Posted by Zdend <pr...@centrum.cz>.
This param in web.xml solves my problem.

<context-param>
    <param-name>org.apache.myfaces.ADD_RESOURCE_CLASS</param-name>
   
<param-value>org.apache.myfaces.component.html.util.StreamingAddResource</param-value>
 </context-param>





--
View this message in context: http://myfaces.10567.n7.nabble.com/ExtensionsFilter-corrupt-xlsx-during-download-tp117674p117727.html
Sent from the My Faces - Dev mailing list archive at Nabble.com.

Re: ExtensionsFilter corrupt xlsx during download

Posted by Zdend <pr...@centrum.cz>.
Thanks Leonardo for your reply.
I have the most actual version of commons-fileupload. My upload works fine
but it broke existing xlsx downloads across my whole application. I find
solution which handles download through registered filter on some url
(solution you suggested). This way is not convenient for my purpose because
I perform export and download on many views and many beans and I needs beans
data for export xlsx (I don't download stored files, I export them, send
them as response and delete them), also I would lose messages management.



--
View this message in context: http://myfaces.10567.n7.nabble.com/ExtensionsFilter-corrupt-xlsx-during-download-tp117674p117676.html
Sent from the My Faces - Dev mailing list archive at Nabble.com.

Re: ExtensionsFilter corrupt xlsx during download

Posted by Leonardo Uribe <lu...@gmail.com>.
Hi

File upload depends on commons-fileupload, so one thing you could try
in update that library. Also, you can try move the file to a folder so
you can provide a filter mapping over all files in that folder.

Theoretically the filter shouldn't affect anything else...

regards,

Leonardo Uribe

2014-04-08 13:13 GMT+02:00  <pr...@centrum.cz>:
> Hi, I'am using tomahawk-1.1.9 and JSF 1.2 for uploading file via t:inputFileUpload. When I add following lines to my web.xml
>
>         <filter>
>             <filter-name>MyFacesExtensionsFilter</filter-name>
>             <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
>                 <init-param>
>                         <description>
>                             Set the size limit for uploaded files.
>                                 Format: 10  - 10 bytes
>                                         10k - 10 KB
>                                         10m - 10 MB
>                                         1g  - 1 GB
>                         </description>
>                         <param-name>uploadMaxFileSize</param-name>
>                         <param-value>20m</param-value>
>                     </init-param>
>         </filter>
>         <filter-mapping>
>             <filter-name>MyFacesExtensionsFilter</filter-name>
>           <servlet-name>Faces Servlet</servlet-name>
>             <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
>         </filter-mapping>
>
> It starts to corrupt Excel files during download. (When I opening downloaded Excel spreadsheet it reports that it's corrupted and it has to be repaired). In next step it repairs Excel but it's annoying to repair it every time.
>
> This is my download code.. It's not complete but main parts are contained.
>
> <h:commandLink value="#{ms['win.list_transcription.prescriptionExportAndDownload']}" actionListener="#{transcriptionBean.downloadExportPrescriptions}" title="#{ms['win.list_transcription.prescriptionExportAndDownload']}"  />
>
> FacesContext fc = FacesContext.getCurrentInstance();
> HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
>
> response.reset();
> response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
> response.setContentLength(size);
> response.setContentType(StringUtils.isBlank(contentType) ? DEFAULT_CONTENT_TYPE : contentType);
>
> OutputStream out = null;
> InputStream input = null;
>
> try {
>         input = new FileInputStream(file);
>
>         inputToOutputWriter(input, response, out);
>         } catch (Exception err) {
>                 err.printStackTrace();
>         } finally {
>                 if (deleteOnClose) {
>                         file.delete();
>                 }
> }
> fc.responseComplete();
>
> I don't know if it's possible to register ExtensionsFilter only for one jsf page (import page). My attempts were not successfull. I tried for example this, but it ends that on import_payments.jsf is no servlet present (no action works).
>
>         <filter-mapping>
>             <filter-name>MyFacesExtensionsFilter</filter-name>
>           <servlet-name>Import Faces Servlet</servlet-name>
>             <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
>         </filter-mapping>
>          <servlet>
>                 <servlet-name>Import Faces Servlet</servlet-name>
>                 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
>                 <load-on-startup>1</load-on-startup>
>         </servlet>
>         <servlet-mapping>
>                 <servlet-name>Import Faces Servlet</servlet-name>
>                 <url-pattern>/private/import_payments.jsf</url-pattern>
>         </servlet-mapping>
>         <servlet>
>                 <servlet-name>Faces Servlet</servlet-name>
>                 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
>                 <load-on-startup>2</load-on-startup>
>         </servlet>
>         <servlet-mapping>
>                 <servlet-name>Faces Servlet</servlet-name>
>                 <url-pattern>*.jsf</url-pattern>
>         </servlet-mapping>
>
> Thank you
> Zdend