首页 > 编程语言 > 详细

Java实现多文件边压缩边下载

时间:2019-11-14 17:27:29      阅读:127      评论:0      收藏:0      [点我收藏+]
@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();
    }   
}

Java实现多文件边压缩边下载

原文:https://www.cnblogs.com/sunBinary/p/11858503.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!