文件压缩后,下载
前端代码:
<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();
}
}
}
原创不易,且看且珍惜!