spring mvc 文件打包下载

1 需求分析:

    1接收前台传递的ids数组,查询数据库得到本地文件路径

    2 创建压缩文件

    3 将文件挨个写入压缩文件

    4 得到输出流将数据返回,在页面弹出下载框

    5 由于使用的是ajax进行下载故将下载过程分成两段

                1  用户传递id 查询数据库并生成zip文件

                2 向用户返回下载地址,ajax访问该路径完成下载

一  生成压缩文件的方法(R为手写的异常工具类,可去掉直接返回json数据即可)

/**
	 * 根据用户传递的图片id对查询图片集合
	 * 包含图片名称和本机图片地址
	 * 将问价进行打包供用户下载
	* @Description: TODO(用一句话描述该文件做什么)  
	* @author guochao 
	* @date 2018年4月17日  
	*
	 */
	@PostMapping("/user/down/zip.do")
	
	public R downFileZip(@RequestBody long ids[],HttpServletRequest request){
		List<DownImgDto> list =  imgService.downFileZip(ids);//调用数据库完成数据查找
		// 获取项目的临时目录
		Object obj =request.getSession().getAttribute(SessionConstract.USER_SESSION); // 获取session中的用户信息
		UserEntity user = null;
		if(obj!=null){
			user = (UserEntity)obj;
		}
		List<File> fileList = new LinkedList<File>();//暂存文件列表
		String path =	request.getSession().getServletContext().getRealPath("/uploadFile"); //得到zip文件的生成地址
		File fi= new File(path);//构造zip文件存放的目录
		if(!fi.exists()){
			fi.mkdir();
		}
		String fileName = user.getName()+Md5Utils.produceImgName(user.getName())+".zip";// 以用户名 和md5根据用户名生成的字符串为名称
		if(list!=null && list.size()>0){
				for (DownImgDto downImgDto : list) {
					File file = new File(downImgDto.getImgUrl()); // 构建本地文件
					fileList.add(file); // 将本地文件加入fileList 文件列表

				}	
		}
	//构造压缩文件 
	String zipFileName = path+"/"+fileName;
	
	
	try {
		UserDownZipUtils.downZipManyFile(fileList, zipFileName); // 将文件列表写入压缩文件中
	} catch (IOException e) {		
		e.printStackTrace();
	}
	String url ="/user/down/zip/url.do";
	String realPath = "{\"url\":\""+ url+"\"}"; // 返回下载路径
	return R.ok(realPath);
	}

二 UserDownZipUtils 压缩工具包

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
 * 文件打包下载
 * 将传递过来的文件列表写入zip文件
 * @Description: TODO(用一句话描述该文件做什么)  
* @author guochao 
* @date 2018年4月17日  
*
 */
public class UserDownZipUtils {
public static String downZipManyFile(List<File> fileList,String zipFileName) throws IOException{
	BufferedInputStream br = null;//输入流
	ZipOutputStream out = null; // 压缩文件输出流
	int size =-1;
	
	byte[] buffer = new  byte[2048];// 定义缓冲区
		if(fileList.size()>0){
			out = new ZipOutputStream(new FileOutputStream(zipFileName));
			for (int i = 0; i < fileList.size(); i++) {
				File f =fileList.get(i);
					out.putNextEntry(new ZipEntry(f.getName()));
					br = new BufferedInputStream(new FileInputStream(f));
						while((size=br.read(buffer))!=-1){
							out.write(buffer,0,size);
							out.flush();
						}
			}
			if(br!=null){br.close();}
			if(out!=null){out.close();}
		}
	return zipFileName;
	}
}

三 经过上面两个步骤文件压缩写入zip已经完成了下面开始进行 提供用户下载的方法编写

/**
	 * 用户提供下载 路径为上个方法的返回值
	* @Description: TODO(用一句话描述该文件做什么)  
	* @author guochao 
	* @date 2018年4月17日  
	*
	 */
	@RequestMapping("/user/down/zip/url.do")
	public void downLoadUrl(HttpServletResponse response,HttpServletRequest request){
		
	Object obj =request.getSession().getAttribute(SessionConstract.USER_SESSION);
	UserEntity user = null;
	if(obj!=null){
			user = (UserEntity)obj;
	}
	String path =	request.getSession().getServletContext().getRealPath("/uploadFile");
	File fi= new File(path);
	if(!fi.exists()){
		fi.mkdir();
	}
	String fileName = user.getName()+Md5Utils.produceImgName(user.getName())+".zip";
	String zipFileName = path+"/"+fileName;
		response.setContentType("application/octet-stream");  
	    try {
			response.setHeader("Content-disposition", "attachment; filename="  
			    + new String((fileName).getBytes("utf-8"), "ISO8859-1"));
			DataOutputStream temps = new DataOutputStream(response.getOutputStream());   
		             
		           DataInputStream in = new DataInputStream(new FileInputStream(zipFileName));  
		            
		           byte[] b = new byte[2048];  
		           while ((in.read(b)) != -1) {  
					     temps.write(b);  
					     temps.flush();  
		           }  
		           in.close();  
		           temps.close();  
		        
			
		} catch (IOException e) {
			
			e.printStackTrace();
		} 
	}

四 :文件zip打包下载已经完成了为了方便大家查看,将js代码也贴一下

$.ajax({
            type:'POST',
            contentType:'application/json;charset=utf-8',
            dataType:'json', 
            url:"${pageContext.request.contextPath}/user/down/zip.do",
            data:JSON.stringify(ids),
            success:function(res){
            	if(res.code == 200){
            		var jsonstr =res.data;
            		var a = $.parseJSON( jsonstr );
            		window.location.href="${pageContext.request.contextPath}/"+a.url;
            	setTimeout(function(){
            		location.reload();
            		
            	}, 2000);
            		
            	}else{
            		alert("下载失败,请联系管理员!")
            	}       
            }
        });

 
 

猜你喜欢

转载自blog.csdn.net/master_chaoandqi/article/details/80196839
今日推荐