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();
    	}   
    }
    
  • 相关阅读:
    如何用C++操作无线网卡开启共享热点WiFi?
    delphi中的copy函数和pos函数
    C#使用WinAPI 修改电源设置,临时禁止笔记本合上盖子时睡眠(使用PowerGetActiveScheme等函数,以及C#对WINAPI的调用)
    发布Qt Widgets桌面应用程序的方法(自定义进程步骤,用QT Creator直接生成)
    认识TDD
    基于Bootstrap的Asp.net Mvc 分页
    Chrome控制台 JS调试
    英语学习
    JavaScript中的作用域和声明提前
    LeetCode: Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/sunBinary/p/11858503.html
Copyright © 2011-2022 走看看