下载该zip文件时自动解压缩文件

时间:2015-09-16 09:33:12

标签: java jsp web zip

我的网页上有一个下载按钮,当我点击它时,它会下载一个zip文件。现在我希望有一个功能,当我点击下载按钮时,zip文件应该自动提取并保存在用户定义的文件夹中。

我知道如果我们可以创建一个exe文件并将其添加到下载按钮,那么它应该自动提取zip文件并保存在文件夹中

%>
                    <td align="center">
                    <img onclick="pullReport('<%=reportPath.toString()%>');" title="Click to download this Report" src="./images/down-bt.gif"/>
                    </td>
                </tr>
            <%} %>

这是创建zip文件的方法

public ActionForward pullReport(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws SQLException{
     Connection connection=null;
     boolean cont=false;
     failureList.clear();
     logger.info("dispatch = pullReport");
     String filePaths=null; 
     String filePath = null;
     String fileName = null;
     String srcFileName = null;
     String directory = null;
     try{
          Properties props = Application.getProperties(); 
          String basePath = props.getProperty("std.report_location");
          logger.info(" basepath " + basePath);
          connection=ConnectionManager.getConnection();
          StandardReportsForm standardReportsForm=(StandardReportsForm)form;
          filePaths=standardReportsForm.getFilePath();
         logger.info("filepaths " + filePaths);
          ServletOutputStream fos = null;


          InputStream is = null;
          String [] filePathArr = filePaths.split(",");

          FileIO fio = null;
          FileIO srcFio = null;
          if (filePathArr.length > 1) {
            filePath = filePathArr[0].substring(0,filePathArr[0].lastIndexOf("."))+".zip";
            logger.info(filePath + " creating zip file ......"); 
            directory = basePath+filePath.substring(0,filePath.lastIndexOf('/'));
            logger.info( " Direcory Name :" +directory); 
            fileName = filePath.substring(filePath.lastIndexOf('/')+1);
            logger.info( " File Name :" +fileName); 
            fio = new FileIO(directory,fileName);
            fio.mkDir();
            byte[] buffer = new byte[1024];

            OutputStream fosForZip = fio.createOutputStream();

            ZipOutputStream zos = new ZipOutputStream(fosForZip);
            InputStream fis = null;
            for (int i=0; i < filePathArr.length; i++) {
                srcFileName = filePathArr[i].substring(filePathArr[i].lastIndexOf('/')+1);
                srcFio = new FileIO(directory,srcFileName);

                if (srcFio.isFileExist()) {
                    cont=true;

                    logger.info(" adding into zip file " +srcFileName);
                    fis = srcFio.createInputStream();
                    BufferedInputStream bis = new BufferedInputStream(fis);

                    zos.putNextEntry(new ZipEntry(srcFileName));

                    int length;

                    while ((length = bis.read(buffer)) != -1) {
                        zos.write(buffer, 0, length);
                    }

                    zos.closeEntry();
                    // close the InputStream
                    bis.close();
                    srcFio.closeInputStream(fis);
                } else {
                    logger.info(srcFileName + " file does not exist on shared drive");
                    cont =false;
                    break;
                }

            }
            FileIO.closeOutputStream(zos);
            if (!cont){
                standardReportsForm.setMissingFileName(srcFileName);
                request.getSession().getAttribute("fetchReports");
                standardReportsForm.setFetchedReports((List<ReportDetails>)request.getSession().getAttribute("fetchReports"));
                return mapping.findForward("fetchReport");
            }

          } else {
            filePath = filePathArr[0];
            fileName = filePath.substring(filePath.lastIndexOf('/')+1);
          }

          if (basePath.startsWith("smb")) {
            SmbFile smbFile = new SmbFile(basePath+filePath,SMBHelper.getInstance().createAuthFromSmbLocation(basePath));
            if(smbFile.exists())
            {
                    is = new SmbFileInputStream(smbFile);
                    cont=true;
            }
          } else {
            File file=new File(basePath+filePath);
            if(file.exists())
            {
                    is = new FileInputStream(file);
                    cont=true;
            }
          }
          if(cont)
          {
              fos=response.getOutputStream();

              setContentType(response, fileName);

                //fos.write (baos.toByteArray());
              ByteArrayOutputStream bos = new ByteArrayOutputStream();
              byte[] buf = new byte[1024];
              for (int readNum; (readNum = is.read(buf)) != -1;) {
                  bos.write(buf, 0, readNum);
              }

                byte[] bytes = bos.toByteArray();
                fos.write(bytes);
                fos.flush();
                fos.close();

          } else {
                standardReportsForm.setMissingFileName(fileName);
                request.getSession().getAttribute("fetchReports");
                standardReportsForm.setFetchedReports((List<ReportDetails>)request.getSession().getAttribute("fetchReports"));
                return mapping.findForward("fetchReport");
          }

        }catch(SQLException sx) {
            logger.error(" error log SQLException " ,sx);
            failureList.add(new UROCException(UROCMessages.getMessage("ERR_CONN_EXEC"), sx));
        } catch(NamingException ne) {
            logger.info("RMI error is "+ne);
            failureList.add(new UROCException(UROCMessages.getMessage("ERR_NAMING_EXEC"), ne));
        } catch(Exception e) {
            logger.error(" error log Exception " ,e);
            failureList.add(new UROCException(UROCMessages.getMessage("ERR_GEN_EXEC", new String[] {"General Exception"}), e));
        } finally {
            SQLHelper.closeConnection(connection, failureList, logger);
        }

        return null;
 }

1 个答案:

答案 0 :(得分:0)

是的,您可以使用java代码解压缩文件。这是示例

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;


public class UnzipUtility {
    public String zipFilePath= "D:/javatut/corejava/src/zipfile.zip";
    public String destDir = "D:/javatut/corejava";
    private static final int BUFFER_SIZE = 4096;
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        UnzipUtility uu = new UnzipUtility();
        uu.unzip(uu.zipFilePath, uu.destDir);
    }
    public void unzip(String zipFilePath,String destDir)throws IOException{
        File destDirectory = new File(destDir);
        if(!destDirectory.exists()){
            destDirectory.mkdir();
        }

        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry zipEntry = zipIn.getNextEntry();
        while(zipEntry!=null){
            String filePath=destDir+File.separator+zipEntry.getName();
            if(!zipEntry.isDirectory()){
                extractFile(zipIn,filePath);

            }
            else{
                File dir = new File(filePath);
                dir.mkdir();
            }

            zipIn.closeEntry();
            zipEntry = zipIn.getNextEntry();
        }
        zipIn.close();


    }
    private void extractFile(ZipInputStream zipIn, String filePath) throws FileNotFoundException {
         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
            byte[] bytesIn = new byte[BUFFER_SIZE];
            int read = 0;
            try {
                while ((read = zipIn.read(bytesIn)) != -1) {
                    bos.write(bytesIn, 0, read);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                bos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
谢谢.......