You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by "Filippov, Andrey" <an...@t-systems.ru> on 2008/04/22 15:10:37 UTC
Two problems: Struts2 + https + file load and Struts2 + file load +
java.lang.IllegalStateException: getOutputStream()
Hello everybody!
I am trying to load file from DB. I use https. In Mozilla I get only one exception but everything finally works. Here is my code and stack trace:
public String execute() throws Exception {
super.execute();
byte[] file = null;
PolicyFileVO policyFile = polInfoInstance.getPolicyFileById(fileId);
file = policyFile.getFile();
String fileType = polInfoInstance.getFileTypeById(policyFile.getType())
.getContentType();
if (file != null) {
this.response.setCharacterEncoding("utf-8");
String fileName = policyFile.getFile_name();
if (!fileType.startsWith("image")) {
this.response.addHeader("Content-Disposition",
"attachment; filename=" + fileName);
}
// final ServletContext sc = ServletActionContext.getServletContext();
this.response.setContentType(fileType);
this.response.setContentLength(file.length);
OutputStream o = null;
try {
o = response.getOutputStream();
o.write(file);
o.flush();
} catch (java.lang.IllegalStateException ex) {
log.error("IllegalStateException in FileContent.execute() method " + ex);
}catch (java.io.IOException ex) {
log.error("IOException in FileContent.execute() method " + ex);
}catch (java.lang.Exception ex) {
log.error("Exception in FileContent.execute() method " + ex);
}finally{
if (o != null){
response.flushBuffer();
o.close();
}
}
}
16:52:20,832 ERROR [UIBean] error when rendering
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:604)
..........................................................................................
16:52:21,004 ERROR [[default]] Servlet.service() for servlet default threw exception
java.io.IOException: Error including path '/layouts/four_rows_layout.jsp'. java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.tiles.servlet.context.ServletTilesRequestContext.include(ServletTilesRequestContext.java:214)
at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:183)
at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:417)
at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:368)
And the second part of my problem happens only in IE6 - when dialog of opening/saving file instead of normal file name like myTest.pdf reflect the action name - something like this: FileContent_action?fileId=5046 (only when I use https - in http it looks fine - myTest.pdf).
Could someone help me?
I appreciate in advance...
Re: Two problems: Struts2 + https + file load and Struts2 + file
load + java.lang.IllegalStateException: getOutputStream()
Posted by Volker Karlmeier <vo...@magiccode.eu>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hello Filippov,
i think you'd better use the method
public java.io.PrintWriter getWriter() throws IOException;
than getOutputStream().
Regards
Volker
Filippov, Andrey schrieb:
> Hello everybody!
>
> I am trying to load file from DB. I use https. In Mozilla I get only
one exception but everything finally works. Here is my code and stack trace:
>
> public String execute() throws Exception {
> super.execute();
>
> byte[] file = null;
> PolicyFileVO policyFile =
polInfoInstance.getPolicyFileById(fileId);
> file = policyFile.getFile();
> String fileType =
polInfoInstance.getFileTypeById(policyFile.getType())
> .getContentType();
> if (file != null) {
> this.response.setCharacterEncoding("utf-8");
>
>
> String fileName = policyFile.getFile_name();
>
>
> if (!fileType.startsWith("image")) {
> this.response.addHeader("Content-Disposition",
> "attachment; filename=" + fileName);
> }
> // final ServletContext sc =
ServletActionContext.getServletContext();
> this.response.setContentType(fileType);
> this.response.setContentLength(file.length);
> OutputStream o = null;
> try {
> o = response.getOutputStream();
> o.write(file);
> o.flush();
> } catch (java.lang.IllegalStateException ex) {
> log.error("IllegalStateException in
FileContent.execute() method " + ex);
> }catch (java.io.IOException ex) {
> log.error("IOException in FileContent.execute()
method " + ex);
> }catch (java.lang.Exception ex) {
> log.error("Exception in FileContent.execute()
method " + ex);
> }finally{
> if (o != null){
> response.flushBuffer();
> o.close();
> }
> }
> }
>
>
> 16:52:20,832 ERROR [UIBean] error when rendering
> java.lang.IllegalStateException: getOutputStream() has already been
called for this response
> at
org.apache.catalina.connector.Response.getWriter(Response.java:604)
> ..........................................................................................
> 16:52:21,004 ERROR [[default]] Servlet.service() for servlet default
threw exception
> java.io.IOException: Error including path
'/layouts/four_rows_layout.jsp'. java.lang.IllegalStateException:
getOutputStream() has already been called for this response
> at
org.apache.tiles.servlet.context.ServletTilesRequestContext.include(ServletTilesRequestContext.java:214)
> at
org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:183)
> at
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:417)
> at
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:368)
>
> And the second part of my problem happens only in IE6 - when dialog of
opening/saving file instead of normal file name like myTest.pdf reflect
the action name - something like this: FileContent_action?fileId=5046
(only when I use https - in http it looks fine - myTest.pdf).
>
> Could someone help me?
> I appreciate in advance...
>
>
>
>
>
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFIDh4Ax4KjH6Tk4MMRAiMdAKDMB27Msv9kcSBMPwh7NxMbrze5PQCfSoS0
PQ4JTCCpJl/v671RQEsXlOQ=
=yNby
-----END PGP SIGNATURE-----
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
RE: Two problems: Struts2 + https + file load and Struts2 + file
load + java.lang.IllegalStateException: getOutputStream()
Posted by UncleLongHair <un...@tidd.cc>.
I was getting the "getOutputStream() has already been called for this
response" problem and figured out a solution. In my case, I was able to
switch from getOutputStream() to getWriter() because I was dealing with text
files, and the error message stopped.
I think the error message is misleading, I think you can get it if either
getOutputStream() gets called more than once OR if both getOutputStream()
and getWriter() are called. I wonder if the idea is to prevent both text
and binary data from being written into a response.
I understand that this might not help everyone, but I thought I'd offer it
up. It might be worthwhile to look at the source for HttpServletResponse to
see the conditions under which the error is thrown.
Uncle
Brad A Cupit wrote:
>
>>> And it is strange because it happens only when I use https and
>>> IE6. When it is http and IE6 it seems to be fine.
>
> these links may help:
> http://eirikhoem.wordpress.com/2007/06/15/generated-pdfs-over-https-with
> -internet-explorer/
>
> http://forum.java.sun.com/thread.jspa?threadID=233446&forumID=45
>
> Brad Cupit
> Louisiana State University - UIS
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>
>
--
View this message in context: http://www.nabble.com/Two-problems%3A-Struts2-%2B-https-%2B-file-load-and-Struts2-%2B-file-load-%2B-java.lang.IllegalStateException%3A-getOutputStream%28%29-tp16832576p17809331.html
Sent from the Struts - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
RE: Two problems: Struts2 + https + file load and Struts2 + file load + java.lang.IllegalStateException: getOutputStream()
Posted by Brad A Cupit <br...@lsu.edu>.
>> And it is strange because it happens only when I use https and
>> IE6. When it is http and IE6 it seems to be fine.
these links may help:
http://eirikhoem.wordpress.com/2007/06/15/generated-pdfs-over-https-with
-internet-explorer/
http://forum.java.sun.com/thread.jspa?threadID=233446&forumID=45
Brad Cupit
Louisiana State University - UIS
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
RE: Two problems: Struts2 + https + file load and Struts2 + file
load + java.lang.IllegalStateException: getOutputStream()
Posted by "Filippov, Andrey" <an...@t-systems.ru>.
Thanx a lot. After I insert "return null" the exception about
> 16:52:20,832 ERROR [UIBean] error when rendering
> java.lang.IllegalStateException: getOutputStream() has already been called > for this response
stopped. But I've still got the problem with IE6 - instead of file name I have the name of my action - as I understand IE6 takes the last part of my url because it looks like filename (dot) extension (FileContent.action?fileId=5067). And it is strange because it happens only when I use https and IE6. When it is http and IE6 it seems to be fine. Could anyone help with this stuff?
Thank you very much!
Sincerely yours.
-----Original Message-----
From: news [mailto:news@ger.gmane.org] On Behalf Of Laurie Harper
Sent: Tuesday, April 22, 2008 9:23 PM
To: user@struts.apache.org
Subject: Re: Two problems: Struts2 + https + file load and Struts2 + file load + java.lang.IllegalStateException: getOutputStream()
Filippov, Andrey wrote:
> Hello everybody!
>
> I am trying to load file from DB. I use https. In Mozilla I get only one exception but everything finally works. Here is my code and stack trace:
>
> public String execute() throws Exception {
> super.execute();
>
> byte[] file = null;
> PolicyFileVO policyFile = polInfoInstance.getPolicyFileById(fileId);
> file = policyFile.getFile();
> String fileType = polInfoInstance.getFileTypeById(policyFile.getType())
> .getContentType();
> if (file != null) {
> this.response.setCharacterEncoding("utf-8");
>
>
> String fileName = policyFile.getFile_name();
>
>
> if (!fileType.startsWith("image")) {
> this.response.addHeader("Content-Disposition",
> "attachment; filename=" + fileName);
> }
> // final ServletContext sc = ServletActionContext.getServletContext();
> this.response.setContentType(fileType);
> this.response.setContentLength(file.length);
> OutputStream o = null;
> try {
> o = response.getOutputStream();
> o.write(file);
> o.flush();
> } catch (java.lang.IllegalStateException ex) {
> log.error("IllegalStateException in FileContent.execute() method " + ex);
> }catch (java.io.IOException ex) {
> log.error("IOException in FileContent.execute() method " + ex);
> }catch (java.lang.Exception ex) {
> log.error("Exception in FileContent.execute() method " + ex);
> }finally{
> if (o != null){
> response.flushBuffer();
> o.close();
> }
> }
> }
There's no return statement in there, which shouldn't even compile...
> 16:52:20,832 ERROR [UIBean] error when rendering
> java.lang.IllegalStateException: getOutputStream() has already been called for this response
> at org.apache.catalina.connector.Response.getWriter(Response.java:604)
> ............................................................................................
> 16:52:21,004 ERROR [[default]] Servlet.service() for servlet default threw exception
> java.io.IOException: Error including path '/layouts/four_rows_layout.jsp'. java.lang.IllegalStateException: getOutputStream() has already been called for this response
> at org.apache.tiles.servlet.context.ServletTilesRequestContext.include(ServletTilesRequestContext.java:214)
> at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:183)
> at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:417)
> at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:368)
This suggests Struts is trying to forward to a JSP after your action
completes, which won't work since you've already sent a file back to the
browser. You execute() method should be returning 'null' to tell Struts
not to do this.
> And the second part of my problem happens only in IE6 - when dialog of opening/saving file instead of normal file name like myTest.pdf reflect the action name - something like this: FileContent_action?fileId=5046 (only when I use https - in http it looks fine - myTest.pdf).
The file name to save to is specified by the Content-Disposition header,
which you are not setting consistently. Sending a correct header every
time should fix this problem.
L.
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org
Re: Two problems: Struts2 + https + file load and Struts2 + file
load + java.lang.IllegalStateException: getOutputStream()
Posted by Laurie Harper <la...@holoweb.net>.
Filippov, Andrey wrote:
> Hello everybody!
>
> I am trying to load file from DB. I use https. In Mozilla I get only one exception but everything finally works. Here is my code and stack trace:
>
> public String execute() throws Exception {
> super.execute();
>
> byte[] file = null;
> PolicyFileVO policyFile = polInfoInstance.getPolicyFileById(fileId);
> file = policyFile.getFile();
> String fileType = polInfoInstance.getFileTypeById(policyFile.getType())
> .getContentType();
> if (file != null) {
> this.response.setCharacterEncoding("utf-8");
>
>
> String fileName = policyFile.getFile_name();
>
>
> if (!fileType.startsWith("image")) {
> this.response.addHeader("Content-Disposition",
> "attachment; filename=" + fileName);
> }
> // final ServletContext sc = ServletActionContext.getServletContext();
> this.response.setContentType(fileType);
> this.response.setContentLength(file.length);
> OutputStream o = null;
> try {
> o = response.getOutputStream();
> o.write(file);
> o.flush();
> } catch (java.lang.IllegalStateException ex) {
> log.error("IllegalStateException in FileContent.execute() method " + ex);
> }catch (java.io.IOException ex) {
> log.error("IOException in FileContent.execute() method " + ex);
> }catch (java.lang.Exception ex) {
> log.error("Exception in FileContent.execute() method " + ex);
> }finally{
> if (o != null){
> response.flushBuffer();
> o.close();
> }
> }
> }
There's no return statement in there, which shouldn't even compile...
> 16:52:20,832 ERROR [UIBean] error when rendering
> java.lang.IllegalStateException: getOutputStream() has already been called for this response
> at org.apache.catalina.connector.Response.getWriter(Response.java:604)
> ............................................................................................
> 16:52:21,004 ERROR [[default]] Servlet.service() for servlet default threw exception
> java.io.IOException: Error including path '/layouts/four_rows_layout.jsp'. java.lang.IllegalStateException: getOutputStream() has already been called for this response
> at org.apache.tiles.servlet.context.ServletTilesRequestContext.include(ServletTilesRequestContext.java:214)
> at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:183)
> at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:417)
> at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:368)
This suggests Struts is trying to forward to a JSP after your action
completes, which won't work since you've already sent a file back to the
browser. You execute() method should be returning 'null' to tell Struts
not to do this.
> And the second part of my problem happens only in IE6 - when dialog of opening/saving file instead of normal file name like myTest.pdf reflect the action name - something like this: FileContent_action?fileId=5046 (only when I use https - in http it looks fine - myTest.pdf).
The file name to save to is specified by the Content-Disposition header,
which you are not setting consistently. Sending a correct header every
time should fix this problem.
L.
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org