• 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();
    	}   
    }
    
  • 相关阅读:
    搭建Linux Kettle服务端重装系统软件或帮助
    JFrame加载Browser,Jxbrowser导入
    Bonita了解
    基于用户控件固定菜单MenuStrip/ToolStripMenuItem列表及动态菜单列表,是上一篇文章的综合和升级
    winfrom打开本地默认浏览器或打开IE浏览器
    Winfrom动态添加MenuStrip菜单,同时绑定反射事件,可扩展后期动态配置
    给GroupBox动态添加一个按钮,实现展开和折叠功能
    Rest导出Excel文件流
    List<HashMap>排序,List内存分页
    解决idea项目部署到Tomcat时Artiface没有文件
  • 原文地址:https://www.cnblogs.com/sunBinary/p/11858503.html
Copyright © 2020-2023  润新知