原文地址:org.apache.tools.zip.*和org.apache.commons.httpclient.*实现远程文件打包下载,支持中文文件名(转)
- package com.kedacom.kdkk.controller.querymanager;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.URLEncoder;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.UUID;
- import java.util.regex.Pattern;
- import java.util.zip.CRC32;
- import java.util.zip.CheckedOutputStream;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.methods.GetMethod;
- import org.apache.tools.zip.ZipEntry;
- import org.apache.tools.zip.ZipOutputStream;
- public class BatchDownload extends HttpServlet {
- private static List list = new ArrayList();
- Date date = null;
- private static int BUF_SIZE = 40480;
- private static String ZIP_ENCODEING = "GBK";
- public BatchDownload() {
- super();
- }
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //设置编码
- request.setCharacterEncoding("utf-8");
- date = new Date();
- //设置下载头信息
- response.setContentType("application/octet-stream");
- response.setHeader("Content-Disposition", "attachment; filename=\""+date.getTime()+".zip\"");
- //要打包下载的图片json参数
- String cbxStr = request.getParameter("cbxStr");
- if(cbxStr.length() > 0){
- cbxStr = cbxStr.substring(0, cbxStr.length()-1);
- String [] cbxs = cbxStr.split(";");
- HttpClient client = new HttpClient();
- GetMethod get = null;
- //创建本地存储文件路径
- new File("d:/vehicleImgs/"+date.getTime()+"/").mkdir();
- for(int i = 0; i < cbxs.length; i ++){
- try {
- //构建远程服务的图片下载路径
- String cbxs2 [] = cbxs[i].split("z");
- String vid = cbxs2[0];
- String timestamp = cbxs2[1];
- String imgtype = cbxs2[2].split(",")[0];
- String imgName = cbxs2[3];
- imgName = imgName.replace(" ", "_").replace(":", "_");
- DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Long timeStamp = format1.parse(timestamp).getTime();
- String imgUrl = getServletContext().getInitParameter("opticmServer");
- //此方法的参数可自行传入,参数值为远程服务的servlet(xxx.do),返回的值为文件流对象
- get = new GetMethod(imgUrl+"&contentId="+vid+"&imgType="+imgtype+"&imgOrder=0&timeStamp="+timeStamp);
- int j = client.executeMethod(get);
- if (200 == j)//是否正确返回
- {
- File storeFile = new File("d:/vehicleImgs/"+date.getTime()+"/"+imgName+".jpg");
- FileOutputStream output = new FileOutputStream(storeFile);
- // 得到网络资源的字节数组,并写入文件
- output.write(get.getResponseBody());
- output.close();
- }else{
- System.out.println("no pic");
- }
- } catch ( Exception e ){
- System.out.println("Exception no pic");
- } finally{
- get.releaseConnection();
- }
- }
- try {
- //开始压缩下载下来的本机图片
- zip("d:\\vehicleImgs\\"+date.getTime()+".zip", new File("d:\\vehicleImgs\\"+date.getTime()+"\\"));
- //下载zip打包后的文件
- FileInputStream fis = new FileInputStream("d:\\vehicleImgs\\"+date.getTime()+".zip");
- byte[] bytes=new byte[BUF_SIZE];
- int r = 0;
- response.flushBuffer();
- while((r=fis.read(bytes))>0) {
- response.getOutputStream().write(bytes,0,r);
- }
- fis.close();
- response.getOutputStream().close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 压缩文件或文件夹
- *
- * @param zipFileName
- * @param inputFile
- * @throws Exception
- */
- public void zip(String zipFileName, File inputFile) throws Exception {
- // 未指定压缩文件名,默认为"ZipFile"
- if (zipFileName == null || zipFileName.equals(""))
- zipFileName = "ZipFile";
- // 添加".zip"后缀
- if (!zipFileName.endsWith(".zip"))
- zipFileName += ".zip";
- // 创建文件夹
- File f = null;
- String path = Pattern.compile("[\\/]").matcher(zipFileName).replaceAll(File.separator);
- int endIndex = path.lastIndexOf(File.separator);
- path = path.substring(0, endIndex);
- f = new File(path);
- f.mkdirs();
- // 开始压缩
- {
- ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
- zos.setEncoding(ZIP_ENCODEING);
- compress(zos, inputFile, "");
- zos.close();
- }
- }
- /**
- * 压缩一个文件夹或文件对象到已经打开的zip输出流 <b>不建议直接调用该方法</b>
- *
- * @param zos
- * @param f
- * @param fileName
- * @throws Exception
- */
- public void compress(ZipOutputStream zos, File f, String fileName) throws Exception {
- if (f.isDirectory()) {
- // 压缩文件夹
- File[] fl = f.listFiles();
- zos.putNextEntry(new ZipEntry(fileName + "/"));
- fileName = fileName.length() == 0 ? "" : fileName + "/";
- for (int i = 0; i < fl.length; i++) {
- compress(zos, fl[i], fileName + fl[i].getName());
- }
- } else {
- // 压缩文件
- zos.putNextEntry(new ZipEntry(fileName));
- FileInputStream fis = new FileInputStream(f);
- this.inStream2outStream(fis, zos);
- zos.flush();
- fis.close();
- zos.closeEntry();
- }
- }
- public void inStream2outStream(InputStream is, OutputStream os) throws IOException {
- BufferedInputStream bis = new BufferedInputStream(is);
- BufferedOutputStream bos = new BufferedOutputStream(os);
- int bytesRead = 0;
- for (byte[] buffer = new byte[BUF_SIZE]; ((bytesRead = bis.read(buffer, 0, BUF_SIZE)) != -1);) {
- bos.write(buffer, 0, bytesRead); // 将流写入
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
下载: