码迷,mamicode.com
首页 > 其他好文 > 详细

zip压缩、文件下载

时间:2015-03-31 18:17:10      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:压缩   java   乱码   

  实现代码:

          // 定义文件根路径:TOMCAT的temp路径 + 时间戳

        String dirName = System.getProperty("java.io.tmpdir")  + System.currentTimeMillis();

        String fileName = "XXX.zip";

        response.setContentType("application/zip");
        response.setCharacterEncoding("UTF-8");
        String dfileName = null;
        dfileName = new String(fileName.getBytes("GB2312"), "ISO_8859_1");
        response.setHeader("Content-disposition", "attachment;filename=" + dfileName);
        OutputStream ouputStream = response.getOutputStream();

        ZipOutputStream zos = new ZipOutputStream(ouputStream);
        zos.setEncoding("gbk");// 解决中文乱码问题,不加这句会莫名其妙多一个乱码空文件夹
        
        CZipUtil.zip(zos, "", dirName);
        zos.flush();
        zos.close();
        ouputStream.flush();

        ouputStream.close();


压缩工具类:


package huihai.sims.common.util;

import huihai.sims.common.util.CCommon;

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.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * 压缩/解压缩zip包处理类,解压过程存在中文乱码问题
 */
public class CZipUtil {
    /**
     * 压缩
     * @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名
     * @param relativePath 相对路径,默认为空
     * @param directory 文件或目录的绝对路径
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void zip(String zipFileName, String relativePath, String directory) throws FileNotFoundException, IOException {
        String fileName = zipFileName;
        if (fileName == null || fileName.trim().equals("")) {
            File temp = new File(directory);
            if (temp.isDirectory()) {
                fileName = directory + ".zip";
            } else {
                if (directory.indexOf(".") > 0) {
                    fileName = directory.substring(0, directory
                            .lastIndexOf("."))
                            + "zip";
                } else {
                    fileName = directory + ".zip";
                }
            }
        }
        ZipOutputStream zos = new ZipOutputStream(
                new FileOutputStream(fileName));
        try {
            zip(zos, relativePath, directory);
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (null != zos) {
                zos.close();
            }
        }
    }

    /**
     * 压缩
     * @param zos 压缩输出流
     * @param relativePath 相对路径
     * @param absolutPath 文件或文件夹绝对路径
     * @throws IOException
     */
    public static void zip(ZipOutputStream zos, String relativePath, String absolutPath) throws IOException {
        File file = new File(absolutPath);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                File tempFile = files[i];
                if (tempFile.isDirectory()) {
                    String newRelativePath = relativePath + tempFile.getName()
                            + File.separator;
                    createZipNode(zos, newRelativePath);
                    zip(zos, newRelativePath, tempFile.getPath());
                } else {
                    zipFile(zos, tempFile, relativePath);
                }
            }
        } else {
            zipFile(zos, file, relativePath);
        }
    }

    /**
     * 压缩文件
     * @param zos 压缩输出流
     * @param file 文件对象
     * @param relativePath 相对路径
     * @throws IOException
     */
    private static void zipFile(ZipOutputStream zos, File file, String relativePath) throws IOException {
        ZipEntry entry = new ZipEntry(relativePath + file.getName());
        zos.putNextEntry(entry);
        InputStream is = null;
        try {
            is = new FileInputStream(file);
            int BUFFERSIZE = 2 << 10;
            int length = 0;
            byte[] buffer = new byte[BUFFERSIZE];
            while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0) {
                zos.write(buffer, 0, length);
            }
            zos.flush();
            zos.closeEntry();
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (null != is) {
                is.close();
            }
        }
    }

    /**
     * 创建目录
     * @param zos zip输出流
     * @param relativePath 相对路径
     * @throws IOException
     */
    private static void createZipNode(ZipOutputStream zos, String relativePath) throws IOException {
        ZipEntry zipEntry = new ZipEntry(relativePath);
        zos.putNextEntry(zipEntry);
        zos.closeEntry();
    }

    /**
     * 解压缩ZIP包
     * @param zipFilePath zip文件路径
     * @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到ZIP包所在目录下与ZIP包同名的文件夹下
     * @throws IOException
     */
    public static void unzip(String zipFilePath, String targetPath) throws IOException {
        ZipFile zipFile = null;
        OutputStream os = null;
        InputStream is = null;
        String dirPath;
        try {
            zipFile = new ZipFile(zipFilePath);
            if (CCommon.isNullOrEmpty(targetPath)) {
                dirPath = zipFilePath.substring(0, zipFilePath.lastIndexOf("."));
            } else {
                dirPath = CCommon.getDirectory(targetPath);
            }
            Enumeration<?> entries = zipFile.getEntries();
            if (entries != null) {
                while (entries.hasMoreElements()) {
                    ZipEntry entry = (ZipEntry)entries.nextElement();
                    String filePath = dirPath + File.separator + entry.getName();
                    if (entry.isDirectory()) {
                        CCommon.createFile(filePath, true);
                    } else {
                        File targetFile = CCommon.createFile(filePath, false);
                        os = new BufferedOutputStream(new FileOutputStream(targetFile));
                        if (entry.getSize() > 0) {
                            is = zipFile.getInputStream(entry);
                            byte[] buffer = new byte[4096];
                            int readLen = 0;
                            while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
                                os.write(buffer, 0, readLen);
                            }
                            is.close(); is = null;
                            os.flush();
                        }
                        os.close(); os = null;
                    }
                }
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (is != null) is.close();
            if (os != null) os.close();
            if (zipFile != null) zipFile.close();
        }
    }
}

zip压缩、文件下载

标签:压缩   java   乱码   

原文地址:http://blog.csdn.net/zzq2yz1314/article/details/44780675

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!