zip压缩、文件下载

实现代码:

// 定义文件根路径: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();

}

}

}

时间: 2024-11-13 08:09:25

zip压缩、文件下载的相关文章

java基础----&gt;Zip压缩的使用(转)

java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使用 GZIP与ZIP压缩的比较 友情链接 关于压缩的简要说明 一. Java中有着压缩的类: CheckedInputStream GetCheckSum()为任何InputStream 产生校验和(不仅是解压) CheckedOutputStream GetCheckSum()为任何OutputS

Java使用Zip压缩文件或整个目录

1.压缩文件或整个目录 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.zip.ZipEntry

ZIP压缩格式与RAR压缩格式

早已习惯了安装系统之后必须安装winrar,压缩文件也已经习惯了rar格式,这种习惯的力量真的挺可怕的.在工作中你的同事可能没有安装winrar,或者他们不喜欢安装盗版软件,这时候你给他们发送过去的是rar文件就会给他们造成麻烦.然而新安装的系统不管是XP还是win7都是原生支持ZIP的,所以为了不给他人造成困扰我决定以后一律用ZIP压缩文件. 其实在公司的一些规范里面也应该推广ZIP格式以便大家能更方便的工作.

java基础之zip(压缩、解压)

本程序依赖第三方包Ant.jar.因为java自带的java.utils.zip.ZipOutputStream对一些敏感中文路径会抛出异常. package javax.zip; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Ou

正确的 zip 压缩与解压代码

网上流传的zip压缩与解压 的代码有很大的问题 虽然使用了ant进行压缩与解压,但是任务的流程还是用的java.util.zip 的方式写的,我在使用的过程中遇到了压缩的目录结构有误,甚至出现不同解压软件显示的目录结构不同的窘境. 下面给出使用org.apache.tools.ant.taskdefs.Zip;和org.apache.tools.ant.taskdefs.Expand 的压缩和解压过程. import java.io.File; import org.apache.tools.a

Xceed Zip压缩和解压控件Xceed Zip Compression Library

Xceed Zip Compression Library 是一个高性能的 Zip 和 Unzip 数据压缩ActiveX控件.通过它,可以创建和操作与Zip文件,也能在内存中直接压缩/解压数据.它设计提供高度灵活性,并且使用快速的多线程 zip 压缩引擎. 具体功能: ActiveX 技术 ATL 3.0编写,简单且独立的 COM 对象和 ActiveX 控件. 无须外部的压缩动态链接库, MFC DLL 或运行库等. 同时有单线程 (STA) 和多线程 (MTA) 模型设计. 不必将组件置于

php ZIP压缩类实例分享

php ZIP压缩类实例分享 ? 1 2 3 4 5 6 <?php $zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt"); $z = new PHPZip(); //$randomstr = random(8); $zipfile = TEMP."/photocome_".$groupid.".zip"; $z->Zip($zipfiles

zip压缩

package com.green.project.compress; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream; public class Zip { /** * 压缩整个文件夹中的所有

dedecms中提取的zip压缩文件操作类zip.class.php

从织梦DeDeCMS中提取的zip压缩文件操作类,包含zip文件压缩.解压缩.添加文件到压缩包中等多个实用的函数,注释详细方便使用. 下载:dedecms中提取的zip压缩文件操作类zip.class.php 包含的函数和简单的使用方法: 1.函数get_List($zip_name) ,函数作用:获取zip文件中的文件列表.函数参数 $zip_name  zip文件名.返回值 文件列表数组. 2.函数Add($files,$compact),函数作用:增加文件到压缩文件.函数参数 $files

php实现ZIP压缩文件解压缩

测试使用了两个办法都可以实现: 第一个:需要开启配置php_aip.dll 1 <?php 2 //需开启配置 php_zip.dll 3 //phpinfo(); 4 header("Content-type:text/html;charset=utf-8"); 5 6 function get_zip_originalsize($filename, $path) { 7 //先判断待解压的文件是否存在 8 if(!file_exists($filename)){ 9 die(