Servlet : zipservlet
[ Home Page | ]
 

Index

  • We assume here your know what a servlets is. For more information, read first an introduction to servlets, a servlet tutorial, or Java tutorial (all links from JavaSoft).
  • This article aims at presenting how to create a servlet that sends a zip file to the user. We create here a html page with a form where you can enter an url. The servlet will get the content of this url (only the html page, not the images or other frames), create a zip file with it, and send you the file.
    This example can be used as a basis to do various things.

  • Sample:
    Enter URL :


  • Download ZipServlet : zipservlet.zip
  • Source code
package javaside.servlet.sample ; 

//****************************************************************************** 
// ----------------------------------------------------------- 
// zipservlet.java 
// ----------------------------------------------------------- 
//   Main class for sample servlet 
// ----------------------------------------------------------- 
// Author : R. BERTHOU 
// E-Mail : rbl@berthou.com 
// URL    : http://www.javaside.com/ 
// ----------------------------------------------------------- 
// Ver  * Author     *  DATE    * Description 
// ....................DD/MM/YY............................... 
// 1.00 * R.BERTHOU  * 12/01/01 * 
//****************************************************************************** 

import java.io.*; 

import javax.servlet.*; 
import javax.servlet.http.*; 
import java.util.zip.*; 
import java.net.*; 
import java.util.*; 

public class zipservlet extends HttpServlet { 

     public void doGet (HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException 
     { 
          byte b[]=new byte[300000]; 

          URL url; 
          String temp; 

          ByteArrayOutputStream bout=new ByteArrayOutputStream(); 
          ZipOutputStream zout=new ZipOutputStream(bout); 
          ServletOutputStream out = res.getOutputStream(); 
          ServletContext servletContext = getServletContext(); 

          if ((temp=req.getParameter("url"))!=null) 
          { 
               try { 
                    url=new URL(temp); 
                    URLConnection uc = url.openConnection(); 

                    DataInputStream input = new DataInputStream(uc.getInputStream()); 

                    int numRead=0; 
                    int size=0; 

                    while (numRead != -1) { 
                         numRead = input.read(b,size,20000); 
                         size+=numRead; 
                    } 

                    zout.putNextEntry(new ZipEntry("file.html")); 
                    zout.write(b,0,size); 
                    zout.closeEntry(); 
                    zout.finish(); 
                    String zip=bout.toString(); 

                    res.setContentType("application/zip"); 
                    res.setHeader("Content-Disposition","inline; filename=output.zip;"); 

                    out.println(zip); 
                    out.flush(); 

               } 
               catch (Exception e) 
               { 
                    res.setContentType("text/html"); 
                    out.println("<html><head><title>Error</title></head>"); 
                    out.println("<body><b>"); 
                    out.println("An error has occured while processing "+temp+"<br>"); 
                    out.println("Here is the exception: <br>"+e+"<br>"); 
                    e.printStackTrace(new PrintWriter(out)); 
                    out.println("</body>"); 
                    out.println("</html>"); 
               } 
          } 
     } 
}

  • Sending a file with a servlet
    This involves two headers: Content-Type and Content-Disposition. The content type is set to "application/zip". The other one is used to specify the filename used by the browser when it starts downloading the file.
    res.setContentType("application/zip");
    res.setHeader("Content-Disposition","inline; filename=output.zip;");

    This header replace "res.setHeader("Content-Disposition","attachment; filename=output.zip;");" (not work with IE5)

    In this example, we create a zip file. We'll discuss later on how to create such files. As soon as we get a byte array with the zip file, we are ready to send it.
    We simply call out.println(zip) to send the file.

  • Creating a zip file Have you ever noticed the java.util.zip package ?
    Basically, a zip file is created by adding ZipEntries to a ZipOutputStream.
    Once we have create a ZipEntry with a file name, we are ready to write an array of byte to the ZipOutputStream. Then we close the entry, finish the work with a call to finish(). We finally get a String containing the zipped file.

    zout.putNextEntry(new ZipEntry("file.html"));
    zout.write(b,0,size);
    zout.closeEntry();
    zout.finish();
    String zip=bout.toString();