java SpringMVC实现文件压缩,文件下载

文件压缩后,下载 

前端代码:

<a target="_blank"  
href="${ctx }/attachmentUploadBean/downloadAttachment?attachmentSessionKey=${attachmentSessionKey}">
一键下载</a>

 后端代码:

package gov.zhbs.web;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;


@Controller
@RequestMapping("/attachmentUploadBean")
public class DownloadController {

	private static final String GBK = "GBK";


	/**
	 * 将所有附件打包并下载
	 * @param session
	 * @param request
	 * @param response
	 * @param attachmentSessionKey
	 */
	@RequestMapping(value = "/downloadAttachment", method = RequestMethod.GET)
	public void downloadAttachment(HttpServletRequest request, HttpServletResponse response, String attachmentSessionKey){
		//将需要压缩的文件添加到这里
		Map<String, byte[]> unpackResult = new HashMap<String, byte[]>();
		byte[]fileDatas1 = null;
		byte[]fileDatas2 = null;
		unpackResult.put("照片1.jpg",fileDatas1);
		unpackResult.put("照片2.jpg",fileDatas2);

		if(CollectionUtils.isNotEmpty(unpackResult.keySet())){
			// 对文件进行压缩
			byte[] fileDatas = filePack(unpackResult);
			try {
				String mimeType = request.getSession().getServletContext().getMimeType(".zip");
				if (mimeType == null) {
					mimeType = "application/octet-stream";
				}
				response.setContentType(mimeType);
				String headerKey = "Content-Disposition";
				String headerValue = String.format("attachment; filename=\"%s\"", URLEncoder.encode("一键下载附件.zip", "utf-8"));
				response.setHeader(headerKey, headerValue);
				response.setHeader("Content-Length", String.valueOf(fileDatas.length));
				response.getOutputStream().write(fileDatas);
				response.flushBuffer();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}





	public static byte[] filePack(Map<String, byte[]> datas){
		try {
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			ArchiveOutputStream out = createOutputStream(byteArrayOutputStream);
			for (String name : datas.keySet()) {
				pack(out, datas.get(name), name);
			}
			out.close();
			return byteArrayOutputStream.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	private static ArchiveOutputStream createOutputStream(OutputStream out) throws ArchiveException {
		ArchiveStreamFactory factory = new ArchiveStreamFactory();
		factory.setEntryEncoding(GBK);
		return factory.createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);
	}




	private static void pack(ArchiveOutputStream out, byte[] data, String fileName) {
		try {
			// 压缩进zip
			out.putArchiveEntry(new ZipArchiveEntry(fileName));
			IOUtils.write(data, out);
			out.closeArchiveEntry();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	
	


}

原创不易,且看且珍惜!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值