package com.gosun.cecs.system.manager.action;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
public class PictureDownload {
public static void getPictureStream(HttpServletRequest request,
HttpServletResponse response,
List<String> urlList,String carnum) //图片url 列表 后面carnum只是用于命名的
throws Exception {
ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
SimpleDateFormat sdf=new SimpleDateFormat("_yyyyMMdd_hhmmss");
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
long fileLength = 0 ;
String filename=carnum+sdf.format(new Date())+".rar"; //文件名 为rar格式
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment; filename="
+ new String(filename.getBytes("gb2312"), "ISO8859-1"));
/** 将数据转为流返回 */
for (int i = 0; i < urlList.size(); i++) {
fileLength=fileLength+ new File(urlList.get(i)).length();
String urlString = urlList.get(i);
urlString = new String(urlString.getBytes("UTF-8"), "GBK");
URL url = new URL(urlString);
if (url != null) {
// File f = new File(urlString);
//图片名称
ZipEntry zipEntry = new ZipEntry(carnum+"_"+(i+1)+".jpg");
zipOut.putNextEntry(zipEntry);
InputStream in = url.openStream();
byte b[] = new byte[2048];
int length = 0;
while ((length = in.read(b)) != -1) {
zipOut.write(b, 0, length);
}
zipOut.closeEntry();
in.close();
}
}
response.setHeader("Content-Length", String.valueOf(fileLength));
zipOut.close();
}
}
SpringMVC 图片压缩的静态类
@RequestMapping(value = "picDownload")
public ModelAndView picDownload(HttpServletRequest request,
HttpServletResponse response,
String id
) throws Exception {
VehTrace v=vehTraceManager.getvehTraceById(id);
List<String> urlList=new ArrayList<String>();
if(!StringUtils.isNullBlank(v.getCar_img_url1()))urlList.add(v.getCar_img_url1());
if(!StringUtils.isNullBlank(v.getCar_img_url2()))urlList.add(v.getCar_img_url2());
if(!StringUtils.isNullBlank(v.getCar_img_url3()))urlList.add(v.getCar_img_url3());
if(!StringUtils.isNullBlank(v.getCar_img_url4()))urlList.add(v.getCar_img_url4());
if(!StringUtils.isNullBlank(v.getCar_img_url5()))urlList.add(v.getCar_img_url5());
String carnum=v.getPlate();
PictureDownload.getPictureStream(request, response, urlList, carnum);
return null;
}
Controller或者Action中 调用的方法 返回null就可以了
<form id="downForm" action="vehTrace.do?method=picDownload&id=${id}" method="post">
</form>
function downPicture(){
$("#downForm").submit();
}
这里使用 form表单来接收 二进制流的文件 不能使用ajax接收 因为ajax接收的类型为
- "xml": 返回 XML 文档,可用 jQuery 处理。
- "html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
- "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
- "json": 返回 JSON 数据 。
- "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
- "text": 返回纯文本字符串
没有二进制流的格式 所以这里就使用form 表单提交后返回的数据来下载压缩好的图片.