You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by "Mrazovic, Maik" <Ma...@t-systems.com> on 2002/07/22 12:49:30 UTC
Strutsproblem: Sending files from Server to client!
Server generates a textfile. After generating server read the file and sends
it to the client. Well, thats noe problem I thought, but a problem within
Struts!
While server wants to make this above within an Action there come en error:
"2002-07-22 12:46:44 - Ctx( /impact ): IllegalStateException in: R( /impact
+ /createCSV2.do + null) Cannot forward as OutputStream or Writer has
already been obtained"
But if server makes this by a servlet it works! Isn´t that strange?
The code:
//userObject from session
HttpSession session = request.getSession(true);
de.tsystems.impact.model.User user =
( de.tsystems.impact.model.User )
session.getAttribute(de.tsystems.impact.constants.Constants.USER_KEY);
//debug-Info
de.tsystems.impact.util.ParameterTest.printParameters(request);
//App.Key: "sql.csv.generate"
String stmt = "something...'";
DBConnector con = DBConnector.getInstance();
java.util.List listResult = con.executeDBStatement(stmt);
java.util.Iterator iter = listResult.iterator();
//Vector we fill with ImpactCSV-Objects
java.util.Vector vectorWithCSVData = new java.util.Vector();
while (iter.hasNext()) {
java.util.List vec = (java.util.List) iter.next();
vectorWithCSVData.add(new de.tsystems.impact.model.ImpactCSV(
((String) vec.get(2)), //land
((String) vec.get(0)), //bm
((String) vec.get(1)), //Version
((String) vec.get(4)), //Monat
((String) vec.get(3)), //Jahr
((String) vec.get(5)) //MengeLPP
));
}
//create empty CSV-File on server
String file = getServletContext().getRealPath("") +
java.io.File.separator + "web-inf" + java.io.File.separator
+ "csv.dat";
//Buffersize for reading and sending data
int buffer = 10 * 1024; //10 kb, increase if necessary
//fill the "csv.dat" at "..\WEB-INF\csv.dat".
FileOutputStream fos = new FileOutputStream(new File(file));
PrintWriter pw = new PrintWriter(fos);
for (int i = 0; i < vectorWithCSVData.size(); i++)
{
de.tsystems.impact.model.ImpactCSV impactSCV =
( de.tsystems.impact.model.ImpactCSV )
vectorWithCSVData.get(i);
pw.write(impactSCV.getLandnummer() + ";" +
impactSCV.getBaumuster() + ";" + impactSCV.getVersion() + ";"
+ impactSCV.getMonat() + ";" + impactSCV.getJahr() +
";" + impactSCV.getWert() + "\n");
}
//clean up all ressources
pw.flush();
pw.close();
fos.close();
//Now sending this file to client
try
{
//BufferedOutputStream out = new
BufferedOutputStream(response.getOutputStream(), buffer);
javax.servlet.ServletOutputStream out =
response.getOutputStream();
String contentType = getServletContext().getMimeType(file);
response.setContentType(contentType);
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte [buffer];
int bytesRead;
while ((bytesRead = fis.read(buf)) != -1)
{
out.write(buf, 0, bytesRead);
}
out.flush();
fis.close();
}
catch (Exception e)
{
e.printStackTrace();
response.sendError(response.SC_NOT_FOUND, e.toString());
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>
Re: Strutsproblem: Sending files from Server to client!
Posted by Patrick Refondini <pa...@jpnet.ch>.
I am not clear about your problem but the following code sample works
fine. Maybe the only important difference is that the perform method
returns null ?
public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
HttpSession session = request.getSession();
(...)
// a temporary output stream
ByteArrayOutputStream bout = new ByteArrayOutputStream();
// a writer to write String to output Stream.
Writer writer = new BufferedWriter(new OutputStreamWriter(bout));
writer.write(xmldoc); // xmldoc could be your "csv.dat" as String
writer.close();
byte[] content = bout.toByteArray();
// set the exact content length from our temp output stream
response.setContentLength(content.length);
// write the bytes content
response.getOutputStream().write(content);
// flush the stream
response.getOutputStream().flush();
return null;
}
Mrazovic, Maik wrote:
> Server generates a textfile. After generating server read the file and sends
> it to the client. Well, thats noe problem I thought, but a problem within
> Struts!
>
> While server wants to make this above within an Action there come en error:
>
> "2002-07-22 12:46:44 - Ctx( /impact ): IllegalStateException in: R( /impact
> + /createCSV2.do + null) Cannot forward as OutputStream or Writer has
> already been obtained"
>
>
> But if server makes this by a servlet it works! Isn´t that strange?
>
> The code:
>
> //userObject from session
> HttpSession session = request.getSession(true);
> de.tsystems.impact.model.User user =
> ( de.tsystems.impact.model.User )
> session.getAttribute(de.tsystems.impact.constants.Constants.USER_KEY);
>
> //debug-Info
> de.tsystems.impact.util.ParameterTest.printParameters(request);
>
> //App.Key: "sql.csv.generate"
> String stmt = "something...'";
>
> DBConnector con = DBConnector.getInstance();
> java.util.List listResult = con.executeDBStatement(stmt);
>
> java.util.Iterator iter = listResult.iterator();
>
> //Vector we fill with ImpactCSV-Objects
> java.util.Vector vectorWithCSVData = new java.util.Vector();
>
> while (iter.hasNext()) {
> java.util.List vec = (java.util.List) iter.next();
> vectorWithCSVData.add(new de.tsystems.impact.model.ImpactCSV(
> ((String) vec.get(2)), //land
> ((String) vec.get(0)), //bm
> ((String) vec.get(1)), //Version
> ((String) vec.get(4)), //Monat
> ((String) vec.get(3)), //Jahr
> ((String) vec.get(5)) //MengeLPP
> ));
> }
>
> //create empty CSV-File on server
> String file = getServletContext().getRealPath("") +
> java.io.File.separator + "web-inf" + java.io.File.separator
> + "csv.dat";
>
> //Buffersize for reading and sending data
> int buffer = 10 * 1024; //10 kb, increase if necessary
>
> //fill the "csv.dat" at "..\WEB-INF\csv.dat".
> FileOutputStream fos = new FileOutputStream(new File(file));
> PrintWriter pw = new PrintWriter(fos);
>
> for (int i = 0; i < vectorWithCSVData.size(); i++)
> {
> de.tsystems.impact.model.ImpactCSV impactSCV =
> ( de.tsystems.impact.model.ImpactCSV )
> vectorWithCSVData.get(i);
>
> pw.write(impactSCV.getLandnummer() + ";" +
> impactSCV.getBaumuster() + ";" + impactSCV.getVersion() + ";"
> + impactSCV.getMonat() + ";" + impactSCV.getJahr() +
> ";" + impactSCV.getWert() + "\n");
> }
>
> //clean up all ressources
> pw.flush();
> pw.close();
> fos.close();
>
> //Now sending this file to client
> try
> {
> //BufferedOutputStream out = new
> BufferedOutputStream(response.getOutputStream(), buffer);
> javax.servlet.ServletOutputStream out =
> response.getOutputStream();
>
> String contentType = getServletContext().getMimeType(file);
>
> response.setContentType(contentType);
>
> FileInputStream fis = new FileInputStream(file);
> byte[] buf = new byte [buffer];
> int bytesRead;
>
> while ((bytesRead = fis.read(buf)) != -1)
> {
> out.write(buf, 0, bytesRead);
> }
>
> out.flush();
> fis.close();
> }
> catch (Exception e)
> {
> e.printStackTrace();
> response.sendError(response.SC_NOT_FOUND, e.toString());
> }
>
> --
> To unsubscribe, e-mail: <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>
>
>
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>