How do I create zip file in Servlet for download?

来源:互联网 发布:java服务器开发面试题 编辑:程序博客网 时间:2024/05/18 02:08

原文链接:https://kodejava.org/how-do-i-create-zip-file-in-servlet-for-download/

The example below is a servlet that shows you how to create a zip file and send the generated zip file for user to download. The compressing process is done by the zipFiles method of this class.

For a servlet to work you need to configure it in the web.xml file of your web application which can be found after the code snippet below.

package org.kodejava.example.servlet;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;public class ZipDownloadServlet extends HttpServlet {    public static final String FILE_SEPARATOR = System.getProperty("file.separator");    protected void doPost(HttpServletRequest request, HttpServletResponse response)             throws ServletException, IOException {        doGet(request, response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response)             throws ServletException, IOException {        try {            //            // The path below is the root directory of data to be            // compressed.            //            String path = getServletContext().getRealPath("data");            File directory = new File(path);            String[] files = directory.list();            //            // Checks to see if the directory contains some files.            //            if (files != null && files.length > 0) {                //                // Call the zipFiles method for creating a zip stream.                //                byte[] zip = zipFiles(directory, files);                //                // Sends the response back to the user / browser. The                // content for zip file type is "application/zip". We                // also set the content disposition as attachment for                // the browser to show a dialog that will let user                 // choose what action will he do to the sent content.                //                ServletOutputStream sos = response.getOutputStream();                response.setContentType("application/zip");                response.setHeader("Content-Disposition", "attachment; filename="DATA.ZIP"");                sos.write(zip);                sos.flush();            }        }        catch (Exception e) {            e.printStackTrace();        }    }    /**     * Compress the given directory with all its files.     */    private byte[] zipFiles(File directory, String[] files) throws IOException {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        ZipOutputStream zos = new ZipOutputStream(baos);        byte bytes[] = new byte[2048];        for (String fileName : files) {            FileInputStream fis = new FileInputStream(directory.getPath() +                 ZipDownloadServlet.FILE_SEPARATOR + fileName);            BufferedInputStream bis = new BufferedInputStream(fis);            zos.putNextEntry(new ZipEntry(fileName));            int bytesRead;            while ((bytesRead = bis.read(bytes)) != -1) {                zos.write(bytes, 0, bytesRead);            }            zos.closeEntry();            bis.close();            fis.close();        }        zos.flush();        baos.flush();        zos.close();        baos.close();        return baos.toByteArray();    }}

The web.xml configuration:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xmlns="http://java.sun.com/xml/ns/javaee"         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"         id="WebApp_ID" version="2.5">    <servlet>        <servlet-name>ZipDownloadServlet</servlet-name>        <servlet-class>org.kodejava.example.servlet.ZipDownloadServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>ZipDownloadServlet</servlet-name>        <url-pattern>/zipservlet</url-pattern>    </servlet-mapping></web-app>
原创粉丝点击