文档章节

用Java生成ZIP文件

素人派
 素人派
发布于 2015/07/22 07:56
字数 279
阅读 20
收藏 0
下面是Spring MVC打包下载文件的一个例子: [codesyntax lang="java" lines="normal"]
/**
 *
 */
package com.dawning.gvui;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author suren
 *
 */
@Controller
@RequestMapping(value = "download")
public class DownloadController
{
	private ServletContext context;

	@RequestMapping("download")
	public ResponseEntity<byte[]> download(HttpSession session, Compontent compontent) throws IOException
	{
		this.context = session.getServletContext();

		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

		ByteArrayOutputStream jsByteArray = new ByteArrayOutputStream();
		ByteArrayOutputStream cssByteArray = new ByteArrayOutputStream();
		if(compontent != null)
		{
			List<String> pathes = compontent.getPathes();
			for(String path : pathes)
			{
				String realPath = context.getRealPath("/download/js/" + path + ".js");
				File realFile = new File(realPath);

				if(!realFile.isFile())
				{
					continue;
				}

				if(realPath.endsWith(".js"))
				{
					jsByteArray.write(FileUtils.readFileToByteArray(realFile));

					String cssFileName = realFile.getName();
					cssFileName = cssFileName.replace(".js", ".css");

					realFile = new File(realFile.getParentFile().getParentFile(), "css/" + cssFileName);
					if(realFile.isFile())
					{
						cssByteArray.write(FileUtils.readFileToByteArray(realFile));
					}
				}
			}

			headers.setContentDispositionFormData("attachment", compontent.getName());
		}

		return new ResponseEntity<byte[]>(getZipFile(jsByteArray.toByteArray(), cssByteArray.toByteArray()),
				headers, HttpStatus.CREATED);
	}

	private byte[] getZipFile(Map<String, byte[]> byteArrayMap)
	{
		ByteArrayOutputStream byteArray = new ByteArrayOutputStream();

		try
		{
			JarOutputStream jarOut = new JarOutputStream(byteArray);

			Set<String> keySet = byteArrayMap.keySet();
			for(String key : keySet)
			{
				byte[] bytes = byteArrayMap.get(key);
				if(bytes.length <= 0)
				{
					continue;
				}

				ZipEntry entry = new ZipEntry(key);
				jarOut.putNextEntry(entry);
				jarOut.write(byteArrayMap.get(key));
			}

			jarOut.close();

			return byteArray.toByteArray();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}

		return new byte[0];
	}

	private byte[] getZipFile(byte[] jsByteArray, byte[] cssByteArray)
	{
		Map<String, byte[]> byteArrayMap = new HashMap<String, byte[]>();

		byteArrayMap.put("js/gvui.js", jsByteArray);
		byteArrayMap.put("css/gvui.css", cssByteArray);

		String fontsPath = this.context.getRealPath("/download/fonts");
		File fontsFolder = new File(fontsPath);
		if(fontsFolder.isDirectory())
		{
			for(File fontFile : fontsFolder.listFiles())
			{
				if(!fontFile.isFile())
				{
					continue;
				}

				try
				{
					byteArrayMap.put("fonts/" + fontFile.getName(),
							FileUtils.readFileToByteArray(fontFile));
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}

		return getZipFile(byteArrayMap);
	}
}
[/codesyntax]

本文转载自:http://surenpi.com/2015/03/02/%e7%94%a8java%e7%94%9f%e6%88%90zip%e6%96%87%e4%bb%b6/

上一篇: avr-project-3
下一篇: JET
素人派

素人派

粉丝 27
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
Oracle的JDBC驱动的版本你了解吗?

classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多...

i33
2012/02/20
343
0
Java解析大量zip文件中的数据,zip文件放在不同的文件夹下

编写一个java应用程序,解析几个不同文件夹下的zip文件,逐个解析完不同的zip文件后,在另一个目录中生成相同名字的文件夹,不同文件夹下有跟每个zip文件相同名字的csv文件,里面存放相应的解...

大象Jepson
2015/07/15
950
1
OpenJDK 里的 AsmTools 简介

原文出处:hengyunabc 前言 https://wiki.openjdk.java.net/display/CodeTools/asmtools 在OpenJDK里有一个项目,用来生成正确的或者不正确的java 文件,主要用来测试和验证。 我们知道直接修...

hengyunabc
2018/07/27
0
0
Java 文件类操作API与IO编程基础知识

阅读目录: https://www.w3cschool.cn/java/java-io-file.html Java 文件 Java 输入流 Java 输出流 Java 阅读器和写入器 Java 随机访问 Java 标准流 Java Zip Jar Java 缓冲通道 Java 文件路...

boonya
10/23
44
0
0016-Avro序列化&反序列化和Spark读取Avro数据

1.简介 本篇文章主要讲如何使用java生成Avro格式数据以及如何通过spark将Avro数据文件转换成DataSet和DataFrame进行操作。 1.1Apache Arvo是什么? Apache Avro 是一个数据序列化系统,Avro提...

Hadoop实操
2018/11/18
69
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 运行shell文件,出现 $'\r': command not found

运行编写的shell脚本时,出现了 $'\\r': command not found 这样的错误提示。 报错的原因是我们在windows系统操作时,编辑器里的换行符是\r\n ,而Linux上为\n,两个系统之间有差异导致的。 ...

芥末无敌
今天
10
0
Java数据结构(上)

枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) 1.Enumeration(枚举) boolean hasMoreElements( ):测试是否有更多的元素 Object nextElement( ):如果此枚举对象至少还...

Firefly-
昨天
17
0
vue 跨层组件通讯 provide inject

https://cn.vuejs.org/v2/api/#provide-inject 类型: provide:Object | () => Object inject:Array<string> | { [key: string]: string | Symbol | Object } 详细: provide 和 inject 主......

阿豪boy
昨天
14
0
黑马程序员面试宝典(Java)Beta6.0免费下载

场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? 是否可以继承String? 重载与重写的区别...

badaoliumang
昨天
14
0
监控linux系统状态

查看系统负载: w/uptime 最后面三个数字表示1分钟,5分钟,15分钟平均有多少个进程占用CPU 占用CPU的进程可以是Running,也可以是Waiting 某一时刻1颗CPU只能有一个进程在使用其资源 #查看c...

asnfuy
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部