【问题标题】:create and download the Zip file java创建并下载 Zip 文件 java
【发布时间】:2016-05-25 06:23:29
【问题描述】:

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

应用程序是在 JavaEE 中使用 struts 和 mysql 完成的。 当用户单击下载按钮时,此操作类被调用。 该代码没有给出任何异常,但也没有提示用户下载任何东西。

请帮我找出代码中的问题。

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

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;
  }
}

【问题讨论】:

    标签: java fileinputstream zipoutputstream


    【解决方案1】:

    完成 :) 我已经在那儿了...只需要提供正确的路径并下载即可....

    这里又是动作类:

    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;
        }
    }
    

    【讨论】:

      【解决方案2】:
      1. 下载报表时拦截请求,复制下载地址并点击。
      2. 防止直接访问url下载任何文件的代码

      实施

      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();
      }
      

      【讨论】:

        猜你喜欢
        • 2011-01-16
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多