文档章节

用Java生成ZIP文件

素人派
 素人派
发布于 2016/12/31 20:49
字数 279
阅读 8
收藏 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/

素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问

暂无文章

Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0
从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
7
0
程序性能checklist

程序性能checklist

Moks角木
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部