qq_45698422
2021-01-09 11:42 阅读 30

我写了个将很多张图片打包成zip,打包完一解压,所有图片都是5kb,都看不了,有大佬帮忙看下吗?

这是我写的工具类

/**
     * 批量文件压缩下载
     *
     * @param urlMap  需要批量下载文件的链接地址列表和名称
     * @param zipName 输出的压缩包名称
     */
    public static void downZip(Map<String, String> urlMap, String zipName) {
        //响应头的设置
        response.reset();
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");

        String downloadName = zipName + ".zip";
        //返回客户端浏览器的版本号、类型
        String agent = request.getHeader("USER-AGENT");
        try {
            //针对IE或者以IE为内核的浏览器:
            if (agent.contains("MSIE") || agent.contains("Trident")) {
                downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
            } else {
                //非IE浏览器的处理:
                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 (Map.Entry<String, String> entry : urlMap.entrySet()) {
            String url = entry.getValue();
            try {
                URL link = new URL(url);
                //返回文件后缀名
                String suffix = FileUtil.suffix(url);
                //文件名
                String filename = entry.getKey() + suffix;
                //添加ZipEntry,并ZipEntry中写入文件流
                //这里,加上i是防止要下载的文件有重名的导致下载失败
                zipos.putNextEntry(new ZipEntry(filename));
                os = new DataOutputStream(zipos);
                InputStream is = new BufferedInputStream(link.openStream());
                byte[] b = new byte[1000];
                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();
        }
    }

这是我的controller

 public void packExp( HttpServletRequest request, HttpServletResponse response) throws IOException {

        Map<String, String> urlMap =new HashMap<>();
        urlMap.put("aaa","http://localhost:8080/profile/upload/2021/01/08/3bdbb2b6-ee96-40b6-a2be-6d1f9031a5a5.jpg");
        urlMap.put("bbb","http://localhost:8080/profile/upload/2021/01/08/ce9742bf-a690-44f7-b3cb-b64e209c1c03.jpg");
        ZipUtil.downZip(urlMap, "test");
    }

解压完生成zip文件后,一解压文件全是5kb

 而且打不开

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

相关推荐