Don-Luciano 2021-01-09 11:42 采纳率: 0%
浏览 120

我写了个将很多张图片打包成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

 而且打不开

  • 写回答

1条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      悬赏问题

      • ¥70 基于模糊控制的统一混沌控制器代码
      • ¥15 有没有精通光束整形的能读懂
      • ¥15 关于#STM32#与AMG8833采用双插值算法进行热成像显示不正常的问题,如何解决?
      • ¥15 求解! 头歌操作系统 课堂练习6.1 块设备访问
      • ¥15 comsol低温等离子体射流气体摩尔分数作为初始摩尔浓度参数输入到介质管出口流注无法推进了
      • ¥15 有没有人解答51的这个问题,如何解决?(关键词-数码管)
      • ¥15 python 爬虫问题
      • ¥15 求运用模拟退火算法寻优,以下是参考我的参考代码
      • ¥15 VB6.0中OptionButton不能赋值TextBox100
      • ¥15 主窗体激活keydown事件,但是阻塞了主线程