用Java生成ZIP文件

本文介绍了一个Spring MVC控制器,用于处理文件下载请求,特别是JS、CSS和字体文件。控制器将多个资源打包成一个ZIP文件,便于客户端一次性下载所有相关资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 *
 */
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]

转载于:https://my.oschina.net/surenpi/blog/481872

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值