zoukankan      html  css  js  c++  java
  • Java实现多文件边压缩边下载

    @ResponseBody
    @RequestMapping(value = "/downloadFile", method = RequestMethod.POST)
    public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
    	
    	String filePath = request.getParameter("fileName").replace("\\", "/");
    	
    	String path = filePath.substring(0,filePath.lastIndexOf("/")+1);
    	String[] fileNames = filePath.substring(filePath.lastIndexOf("/")+1).split(",");
    	
    	//响应头的设置
    	response.reset();
    	response.setCharacterEncoding("utf-8");
    	response.setContentType("multipart/form-data");
    	
    	//设置压缩包的名字
    	//解决不同浏览器压缩包名字含有中文时乱码的问题
    	//附件名称
    	String downloadName = "附件.zip";
    	String agent = request.getHeader("USER-AGENT");   
    	try {
    		if (agent.contains("MSIE")||agent.contains("Trident")) {
    			downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
    		} else {
    			downloadName = new String(downloadName.getBytes("UTF-8"),"ISO-8859-1");
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\"");
    	
    	//设置压缩流:直接写入response,实现边压缩边下载
    	ZipOutputStream zipos = null;
    	try {
    		zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
    		zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法 
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    	
    	//循环将文件写入压缩流
    	DataOutputStream os = null;
    	//文件个数
    	for(int i = 0; i < fileNames.length; i++ ){
    		filePath = path + fileNames[i];
    		//要下载的某个文件的路径
    		File file = new File(filePath);
    		try {
    			//添加ZipEntry,并ZipEntry中写入文件流
    			//这里,加上i是防止要下载的文件有重名的导致下载失败
    			//文件名字
    			zipos.putNextEntry(new ZipEntry(fileNames[i]));
    			os = new DataOutputStream(zipos);
    			InputStream is = new FileInputStream(file);
    			byte[] b = new byte[100];
    			int length = 0;
    			while((length = is.read(b))!= -1){
    				os.write(b, 0, length);
    			}
    			is.close();
    			zipos.closeEntry();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} 
    	}
    	
    	//关闭流
    	try {
    		os.flush();
    		os.close();
    		zipos.close();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}   
    }
    
  • 相关阅读:
    Spring Security教程(一):初识Spring Security
    权限管理系统(二):权限管理系统介绍
    OAuth 2.0介绍
    Java的spi介绍和简单应用
    Spring Boot 2.0官方文档之 Actuator(转)
    Nginx(三):日志文件管理
    Mybatis(五):Mybatis的三种使用方式
    Mybatis里Mapper映射sql文件里insert的主键返回selectKey使用
    Mybatis(四):MyBatis核心组件介绍原理解析和源码解读
    flask-限流器
  • 原文地址:https://www.cnblogs.com/sunBinary/p/11858503.html
Copyright © 2011-2022 走看看