Returning a file as the response on doAction()

366 views
Skip to first unread message

bdi...@gmail.com

unread,
Aug 7, 2015, 4:39:17 AM8/7/15
to Hippo Community
Hi;

What I'm trying to do is; 
Save document list to a CSV or Excel file and return it to the user.

I have a classic page that list the documents and on the doAction() method I'm trying to create the file on the server side and return it to the user, so s/he can download the file.

When I modify response object I'm getting:
[INFO] [talledLocalContainer] java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
Do I have to use response.sendRedirect() and prepare another page for this purpose?

I could not find any examples on the web. Can someone help me with this?

Regards.

Berkhan Dipso

unread,
Aug 10, 2015, 3:23:31 AM8/10/15
to Hippo Community
This is the code I tried; 
@Override
public void doAction(HstRequest request, HstResponse response) {

//super.doAction(request, response);
       FileInputStream inputStream;
try {
inputStream = new FileInputStream("C:\\KKL.xls");
response.setContentType("application/vnd.ms-excel");
       response.setHeader("Content-Disposition","attachment; filename=KKL.xls");
       IOUtils.copy(inputStream, response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}


It is downloading the file but on the server site it raises an error:
[INFO] [talledLocalContainer] Aug 10, 2015 10:21:13 AM org.apache.catalina.core.StandardWrapperValve invoke
[INFO] [talledLocalContainer] SEVERE: Servlet.service() for servlet [default] in context with path [/site] threw exception
[INFO] [talledLocalContainer] java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
[INFO] [talledLocalContainer] at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:466)
[INFO] [talledLocalContainer] at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:128)
[INFO] [talledLocalContainer] at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:128)
[INFO] [talledLocalContainer] at org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.sendError(SaveContextOnUpdateOrErrorResponseWrapper.java:87)
[INFO] [talledLocalContainer] at org.hippoecm.hst.container.HstFilter.sendError(HstFilter.java:752)
[INFO] [talledLocalContainer] at org.hippoecm.hst.container.HstFilter.doFilter(HstFilter.java:524)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
[INFO] [talledLocalContainer] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
[INFO] [talledLocalContainer] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
[INFO] [talledLocalContainer] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
[INFO] [talledLocalContainer] at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
[INFO] [talledLocalContainer] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
[INFO] [talledLocalContainer] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
[INFO] [talledLocalContainer] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
[INFO] [talledLocalContainer] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:122)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java)
[INFO] [talledLocalContainer] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:170)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)
[INFO] [talledLocalContainer] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
[INFO] [talledLocalContainer] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
[INFO] [talledLocalContainer] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
[INFO] [talledLocalContainer] at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
[INFO] [talledLocalContainer] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
[INFO] [talledLocalContainer] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[INFO] [talledLocalContainer] at java.lang.Thread.run(Unknown Source)
[INFO] [talledLocalContainer] 
[INFO] [talledLocalContainer] Aug 10, 2015 10:21:13 AM org.apache.catalina.core.ApplicationDispatcher invoke
[INFO] [talledLocalContainer] SEVERE: Servlet.service() for servlet jsp threw exception
[INFO] [talledLocalContainer] java.lang.IllegalStateException: getOutputStream() has already been called for this response
[INFO] [talledLocalContainer] at org.apache.catalina.connector.Response.getWriter(Response.java:636)
[INFO] [talledLocalContainer] at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
[INFO] [talledLocalContainer] at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:104)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
[INFO] [talledLocalContainer] at org.apache.jsp.WEB_002dINF.jsp.errorpages.ErrorPage500_jsp._jspService(ErrorPage500_jsp.java:96)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
[INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServlet._serviceJspFile(JspServlet.java:390)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
[INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:460)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:411)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:200)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)
[INFO] [talledLocalContainer] 10.08.2015 10:21:13 WARN  http-bio-9080-exec-10 [HstFilter.doFilter:522] ContainerException for '/mevzuat/_hn:action%7Cr74_r1_r2%7C/site/kalite/cevre-mevzuati_iii_/cevre-kanunu_iii_2872a-000_': org.hippoecm.hst.core.container.ContainerException: java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
[INFO] [talledLocalContainer] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
[INFO] [talledLocalContainer] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
[INFO] [talledLocalContainer] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
[INFO] [talledLocalContainer] at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
[INFO] [talledLocalContainer] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
[INFO] [talledLocalContainer] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[INFO] [talledLocalContainer] at java.lang.Thread.run(Unknown Source)
[INFO] [talledLocalContainer] 
[INFO] [talledLocalContainer] Aug 10, 2015 10:21:13 AM org.apache.catalina.core.StandardHostValve custom
[INFO] [talledLocalContainer] SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/WEB-INF/jsp/errorpages/ErrorPage500.jsp]
[INFO] [talledLocalContainer] org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:585)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:465)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServlet._serviceJspFile(JspServlet.java:390)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
[INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604)
[INFO] [talledLocalContainer] at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:460)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:411)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:200)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)
[INFO] [talledLocalContainer] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
[INFO] [talledLocalContainer] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
[INFO] [talledLocalContainer] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
[INFO] [talledLocalContainer] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
[INFO] [talledLocalContainer] at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
[INFO] [talledLocalContainer] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
[INFO] [talledLocalContainer] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[INFO] [talledLocalContainer] at java.lang.Thread.run(Unknown Source)
[INFO] [talledLocalContainer] Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
[INFO] [talledLocalContainer] at org.apache.catalina.connector.Response.getWriter(Response.java:636)
[INFO] [talledLocalContainer] at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
[INFO] [talledLocalContainer] at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:104)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
[INFO] [talledLocalContainer] at org.apache.jsp.WEB_002dINF.jsp.errorpages.ErrorPage500_jsp._jspService(ErrorPage500_jsp.java:96)
[INFO] [talledLocalContainer] at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
[INFO] [talledLocalContainer] at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
[INFO] [talledLocalContainer] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
[INFO] [talledLocalContainer] ... 23 more
[INFO] [talledLocalContainer] 

Berkhan Dipso

unread,
Aug 10, 2015, 5:16:10 AM8/10/15
to Hippo Community
I've resolved this issue with redirection.

on doAction() method I've created my file and pass file name parameter to a new page using redirection;
this is the code that I used doBeforeRender() method of redirected page:
@Override
public void doBeforeRender(HstRequest request, HstResponse response) {
super.doBeforeRender(request, response);

String file = getPublicRequestParameter(request, "file");
System.out.println(file);
        FileInputStream inputStream;
try {
inputStream = new FileInputStream("C:\\temp\\" + file);
response.setContentType("application/vnd.ms-excel");
       response.setHeader("Content-Disposition","attachment; filename=" + FilenameUtils.getName(file));
       
       try {
       IOUtils.copy(inputStream, response.getOutputStream());
       } finally {
           if (inputStream != null) 
               inputStream.close();
       }
} catch (IOException e) {
e.printStackTrace();
}



Bert Leunis

unread,
Aug 10, 2015, 5:21:54 AM8/10/15
to Hippo Community
On Mon, Aug 10, 2015 at 11:16 AM, Berkhan Dipso <bdi...@gmail.com> wrote:
I've resolved this issue with redirection.
Ah, you found it already. You have dealt with the PRG pattern now, as described on [1]. After the processing in the doAction method, a redirect is done always. Next steps, like for example showing validation or success info (which is the example described at [1]) are done in a next GET request. So that code will, indeed, be added to a doBeforeRender method of an HstComponent.

[1] http://www.onehippo.org/library/concepts/component-development/hst-2-forms.html

--
Hippo Community Group: The place for all discussions and announcements about Hippo CMS (and HST, repository etc. etc.)
 
To post to this group, send email to hippo-c...@googlegroups.com
RSS: https://groups.google.com/group/hippo-community/feed/rss_v2_0_msgs.xml?num=50
---
You received this message because you are subscribed to the Google Groups "Hippo Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to hippo-communi...@googlegroups.com.
Visit this group at http://groups.google.com/group/hippo-community.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages