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>