java 多文件(小文件)打包压缩成zip,不产生临时文件,响应给前端下载

java 多文件(小文件)打包压缩成zip,不产生临时文件,响应给前端下载

具体压缩下载方案:

首先将文件读取进来
读取文件内容,根据文件的不同,读取的方式不同,像本地文件,或是在数据库中储存的原文;
本地文件直接用io流读取即可,数据库中有时候会储存原文,这时候只需要将内容写人文件就可以了;

	因为工作要求数据库存原文,所以我只要在数据库中查找到我要的原文数据,写入到文件就可以;
	使用List集合接收查到的数据集合

在这里演示就是用假数据代替查找的数据

public static List<String> strListTestData(){
        List<String> strings = new ArrayList<String>();
        strings.add("MIICZzCCAg2zIwMTkxMjE4MDEzNDIyWhgPMjAyMDEyMTgwMTM0MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxcS5jb20xCzAJBgNVBAgTAjEyMMCA8gwHwYDVR0jBBgwFoAUjBra/T15AMMHdeSyss/tAO06BeowCgYIKoEcz1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
        strings.add("MIICZzCCAg21UEAxMJYW53ZWl0ZWNoMCIYDzIwMTkxMjE4MDEzNDIyWhgPMjAyMDEyMTgwMTM0MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxcS5jbFfMTIzNDU2z1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
        strings.add("MIICZzCCAg2GA1UEAxMJYW53ZWl0ZWNoMCIYDzIwMTkxMjE4MDEzNDIyWhgPMjAyMDEyMTgwMTM0MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxTFfMTIzND1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
        strings.add("MICZzCCAg20MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxcS5jb20xCzAJBgNVBAgTAjEyMQ0wCwYDVQQHEwQwMDAwMQswCQYDVQQKEwIwMTENMAsGA1UECA8gwHwYDVR0jBBgwFoAUjBra/T15AMMHdeSyss/tAO06BeowCgYIKoEcz1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
        return strings;
    }

一共有4条数据需要生成文件下载,只有几KB,产生临时文件还需要定时清理,因为写入文件是使用IO流 ,是以Baye[]类型数组写入,所以我们将数据直接转换成baye[] 类型数组;

创建一个HashMap集合,键为文件名,值为原文

多文件压缩或读取时文件名要保持唯一,可以用UUID或者是时间与循环次数作为文件名字;

使用UUID生成文件名;

String fileName= UUID.randomUUID().toString().replace("-", "");
		System.out.println(fileName);

使用时间格式类型生成文件名;

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        String fileTimeName = simpleDateFormat.format(new Date());
        System.out.println(fileTimeName);

这里我为了保证文件的唯一性,使用的时间和UUID作为文件名

public static Map<String,byte[]> newCERFile(List<String> strList) {
        //创建一个HashMap集合  key为文件名 value为源文件转后的值
        Map<String, byte[]> stringMap = new HashMap<String, byte[]>();
        //遍历接收到的集合
        for (String s : strList) {
            //转为byte[]
            byte[] sourceByte = s.getBytes();
            if (null != sourceByte) {
                    //当前时间字符创
                    SimpleDateFormat timeName = new SimpleDateFormat("yyyyMMddhhmmss");
                    //UUID
                    String uuidName = UUID.randomUUID().toString().replace("-","");
                    //key为文件名 value为源文件转后的值
                    stringMap.put(timeName.format(new Date())+uuidName+".cer",sourceByte);
            }
        }
        return stringMap;
    }

边压缩ZIP格式文件边下载(直接输出ZIP流)

下载时候需要告诉浏览器文件类型,这里配置文件写在了后端

	@RequestMapping("/download")
    public void downloadCERService(HttpServletResponse response){
		Map<String, byte[]> stringByte= newCERFile(strListTestData());
        // 配置文件下载
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        //压缩包文件名
        SimpleDateFormat fileZipName = new SimpleDateFormat("yyyyMMddhhmmss");
        // 下载文件时候防止显示中文乱码 指定文件类型 .zip
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileZipName.format(new Date())+".zip", "UTF-8"));
        //将文件打包成压缩文件
        ZipOutputStream zipout = new ZipOutputStream(response.getOutputStream());
        Set<Map.Entry<String, byte[]>> dataEntrys = stringByte.entrySet();
        for (Map.Entry<String, byte[]> data : dataEntrys) {
            InputStream bufferIn = new BufferedInputStream( new ByteArrayInputStream(data.getValue()) );
            byte[] bs = new byte[1024];
            Arrays.fill(bs, (byte) 0);
            //创建压缩文件内的文件
            zipout.putNextEntry(new ZipEntry(data.getKey()));
            int len = -1;
            while ((len = bufferIn.read(bs)) > 0) {
                zipout.write(bs, 0, len);
            }
            bufferIn.close();
        }
        try {
            zipout.close();
        } catch (IOException e) {
        }
    }

为了方便给大家展示,截取改动了部分代码及结构;

这时候直接打开服务器访问http://localhost:8080/download

浏览器自动跳转到下载界面
java 多文件(小文件)打包压缩成zip,不产生临时文件,响应给前端下载_第1张图片

你可能感兴趣的:(java)