创建并下载 Zip 文件 java

create and download the Zip file java

在我的申请中没有特定投标的文件(pdf)。我需要从这些 pdf 文件创建一个 zip 文件并允许用户下载它。

使用 struts 和 mysql 在 JavaEE 中完成应用程序。 当用户单击下载按钮时,将调用此操作 class。 该代码没有给出任何例外,但也不会提示用户下载任何内容。

请帮我找出代码中的错误。

以下是我的动作源码class..

public class ActDownloadDocZip extends Action {
static Logger logger = Logger.getLogger(ActDownloadDocZip.class);

public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    String realPath = getServlet().getServletContext().getRealPath(
            "/WEB-INF/log4jConfiguration.xml");
    DOMConfigurator.configure(realPath);
    logger.info("In ActDownloadDocZip....");
    ActionForward forward = null;
    HttpSession session = request.getSession();
    // get a db connection
    Connection conn = null;
    String[][] nameFile = null;
    String tenderNo = "";
    try {
        conn = ProxoolConnection.getProxoolConnectionSLT();
        tenderNo = request.getParameter("tenderNo");
        // File fileex=new File("xxx.zip");
        FileOutputStream zipFile = new FileOutputStream(new File("xxx.zip"));
        ZipOutputStream output = new ZipOutputStream(zipFile);
        // call getPdfFiles method here
        ILoadTenders ld = new LoadTenders();
        nameFile = ld.getPdfFileListToTender(conn, tenderNo);//this method brings back the relevant pdf file names and paths((pdfname1,pdfpath1),(pdfname2,pdfpath2))
        for (int i = 0; i < nameFile.length; i++) {
            ZipEntry zipEntry = new ZipEntry(nameFile[i][0].trim());
            output.putNextEntry(zipEntry);
            FileInputStream pdfFile = new FileInputStream(new File(
                    nameFile[i][1].trim()));
            IOUtils.copy(pdfFile, output); 
            pdfFile.close();
            output.closeEntry();
        }
        output.finish();
        output.close();
    } catch (SQLException e) {
        System.out.println("actDownloadDocZip " + e);
        logger.fatal(e.getMessage());
    } catch (Exception e) {
        System.out.println("actDownloadDocZip1 " + e);
        logger.fatal(e.getMessage());
    } finally {
        if (conn != null) {
            ProxoolConnection.closeProxoolConnectionSLT(conn);
        }
    }
    forward = mapping.findForward("publicdashboard");
    return forward;
  }
}

完成 :) 我已经在那里了...只需提供正确的路径并下载它....

此处再次执行操作 class:

package com.affno.etender.frontend;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import com.affno.util.proxool.ProxoolConnection;

public class ActDownloadDocZip extends Action {
    static Logger logger = Logger.getLogger(ActDownloadDocZip.class);

    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        String realPath = getServlet().getServletContext().getRealPath(
                "/WEB-INF/log4jConfiguration.xml");
        DOMConfigurator.configure(realPath);
        logger.info("In ActDownloadDocZip....");

        ActionForward forward = null;
        HttpSession session = request.getSession();

        // get a db connection
        Connection conn = null;

        String[][] nameFile = null;

        String tenderNo = "";

        ////
        FileOutputStream fos = null;
        ZipOutputStream zipOut = null;
        FileInputStream fis = null;

        MessageResources messages = MessageResources.getMessageResources("resources.Upload");
        String dirzip = messages.getMessage("save.dir");
        tenderNo = request.getParameter("tenderNo").trim();
        String zipFolderName =tenderNo + ".zip";
        String filepathzipped = dirzip + zipFolderName;

        try {
            conn = ProxoolConnection.getProxoolConnectionSLT();

            fos = new FileOutputStream(filepathzipped);
            zipOut = new ZipOutputStream(new BufferedOutputStream(fos));

            ILoadTenders ld = new LoadTenders();
            nameFile = ld.getPdfFileListToTender(conn, tenderNo);

            for (int i = 0; i < nameFile.length; i++){
                File input = new File(nameFile[i][1].trim());
                fis = new FileInputStream(input);
                ZipEntry ze = new ZipEntry(input.getName());
                System.out.println("Zipping the file: "+input.getName());
                zipOut.putNextEntry(ze);
                byte[] tmp = new byte[4*1024];
                int size = 0;
                while((size = fis.read(tmp)) != -1){
                    zipOut.write(tmp, 0, size);
                }
                zipOut.flush();
                fis.close();
            }
            zipOut.close();
            System.out.println("Done... Zipped the files...");
            //zip created

            //downloading the zip
            File file = new File(filepathzipped);
            if(!file.exists()){
                System.out.println("file not found");
            }
            response.setContentType("APPLICATION/OCTET-STREAM");
            response.setHeader("Content-Disposition","attachment; filename=\"" + zipFolderName + "\"");

            OutputStream out = response.getOutputStream();
            FileInputStream in = new FileInputStream(file);
            byte[] buffer = new byte[4096];
            int length;
            while ((length = in.read(buffer)) > 0){
               out.write(buffer, 0, length);
            }
            in.close();
            out.flush();    
        }
        ////
         catch (SQLException e) {
            System.out.println("actDownloadDocZip " + e);
            logger.fatal(e.getMessage());
        } catch (Exception e) {
            System.out.println("actDownloadDocZip1 " + e);
            logger.fatal(e.getMessage());
        } finally {
            if (conn != null) {
                ProxoolConnection.closeProxoolConnectionSLT(conn);
            }
        }

        forward = mapping.findForward("publicdashboard");
        /*
         * if (forward != null) { forward = new ActionForward(forward.getPath()
         * +"servlet/DownloadServlet?" + zipFile, true); }
         */
        return forward;
    }
}
  1. 下载报告时拦截请求复制下载url并点击
  2. 防止直接访问url下载任何文件
  3. 的代码

实施

if (param.equals("downloadfile")) {
    session = request.getSession();
    relativePath = request.getRealPath("/");
    String filePathName = relativePath + "FILES\EXCEL\ASC_Mapping_" + user.getLoginID() + ".zip";
    System.out.println("guddu 1 " + filePathName);

    if (filePathName == null || filePathName.equals("")) {
        throw new ServletException("File Name can't be null or empty");
    }

    File file1 = new File(filePathName);
    if (!file1.exists()) {
        throw new ServletException("File doesn't exists on server.");
    }

    response.setContentType("APPLICATION/OCTET-STREAM");
    response.setHeader("Content-Disposition", "attachment;filename=ASC_Mapping_" + user.getLoginID() + ".zip");

    FileInputStream fileInputStream = new FileInputStream(file1);
    OutputStream os = response.getOutputStream();
    byte[] bufferData = new byte[4096];
    int read = 0;
    while ((read = fileInputStream.read(bufferData)) > 0) {
        os.write(bufferData, 0, read);
    }

    os.close();
    fileInputStream.close();
    response.flushBuffer();
}