工作日记关于下载文件为zip包并生成文件MD5校验码

这边小白实现思路为先要下载的文件压缩到本地为zip包然后通过字节或者inputstream生成MD5码

,这边实现是通过inputstream生成的 、

记录一下代码,我这边由于要部署的java服务器与minio服务器是一起的所以不需要考虑时间问题,耗费不是很大,

    /**
     * 返回打包后的应用数据文件和含有MD5校验信息的文件的压缩包
     *
     * @param id 项目主键ID
     */
    @Override
    public void packageApplicationData(String id, HttpServletResponse response) {
        
        ProjectInfo projectInfo = getProjectInfo(id);
        String projectId = projectInfo.getProjectId();
        String scheduleVersion = projectInfo.getScheduleVersion();
        
        String dirPrefix = projectId + FileSymbolConstans.DIR_DELIMITER + scheduleVersion + FileSymbolConstans.DIR_DELIMITER
                + FileSystemConstans.DIR_DATA_MAKE + FileSymbolConstans.DIR_DELIMITER;
        log.info("开始下载文件");
        
        Iterable<Result<Item>> results = MinIoUtil.getObjByPrefix(FileSystemConstans.BUCKET_PROJECTS, dirPrefix + "Application", true);
        
        log.info("数据包共计文件{}", CollectionUtil.newArrayList(results).size());
        
        ZipOutputStream os = null;
        InputStream in = null;
        InputStream zipIn = null;
        try {
            String zipFilePath = DEF_DESTDIRPATH + dirPrefix + "Application" + FileSymbolConstans.DIR_DELIMITER;
            File file = new File(zipFilePath + "Application.zip");
            if (!file.exists()) {
                file.getParentFile().mkdirs();
            }
            os = new ZipOutputStream(new FileOutputStream(file));
             
            for (Result<Item> result : results) {
                Item item = result.get();
                String objectName = item.objectName();
                if (objectName.contains("isNull") || StrUtil.isEmpty(objectName)) {
                    // 说明为isnull文件则不做处理
                    continue;
                }
                os.putNextEntry(new ZipEntry(objectName.replace(dirPrefix, "")));
                in = MinIoUtil.getObject(FileSystemConstans.BUCKET_PROJECTS, objectName);
                byte[] datas = new byte[1024 * 8];
                int len = -1;
                while ((len = in.read(datas)) != -1) {
                    os.write(datas, 0, len);
                }
                in.close();
                os.closeEntry();
            }
            os.close();
            log.info("数据包压缩完成");
            // 生成MD5文件
            generateMD5Hex(new File(zipFilePath + "Application.zip"), zipFilePath);
            
            File zipFile = new File(DEF_DESTDIRPATH + dirPrefix + "Application.zip");
            if (!zipFile.exists()) {
                zipFile.getParentFile().mkdirs();
            }
            ZipUtil.zip(zipFile, CharsetUtil.defaultCharset(),true, new File(zipFilePath));
            log.info("数据包生成并打包完成");
            
            zipIn = new FileInputStream(zipFile);
            PackageData(zipIn, response, zipFile.getName());
            zipIn.close();
            
        } catch (Exception e) {
            log.error("打包项目{}失败,失败原因为: {}",id,e.getMessage());
            closeStream(os, in, zipIn);
            throw new FileSystemException("打包项目" + id + "数据包失败");
        }
        
        ZipFileUtil.deleteZipDir(new File(DEF_DESTDIRPATH + dirPrefix));
    }
    /**
     * 将压缩包返回给前端
     * @param inputStream   输入流
     * @param response  响应头
     * @param fileName  文件名
     */
    private void PackageData(InputStream inputStream, HttpServletResponse response,String fileName) {
        try {
            response.setHeader("Content-disposition", "attachment;");
            response.setHeader("filename", URLEncoder.encode(fileName, "UTF-8"));
            response.setHeader("Access-Control-Expose-Headers", "Content-disposition,filename");
            response.setCharacterEncoding("UTF-8");
            log.info("{}文件打包完成",fileName);
            IOUtils.copy(inputStream,response.getOutputStream());
        } catch (IOException e) {
            log.error("数据打包失败,失败原因为:{}", e.getMessage());
            throw new ServiceException(e.getMessage());
        }
    }
    /**
     * 关闭流
     * @param os    输出流
     * @param in    输入流
     */
    private void closeStream(OutputStream os, InputStream... in) {
        if (os != null) {
            try {
                os.close();
            } catch (IOException ex) {
                log.error("os.close error: " + ex);
            }
            os = null;
        }
        
        for (InputStream inputStream : in) {
            if (in != null) {
                try {
                    for (InputStream stream : in) {
                        stream.close();
                    }
                } catch (IOException ex) {
                    log.error("in.close error: " + ex);
                }
                in = null;
            }
        }
    }
    
    /**
     * 生成MD5值
     * @param file  压缩文件
     * @return  生成的MD5文件路径
     */
    private String generateMD5Hex(File file,String zipFilePath) {
        try {
            log.info("开始生成MD5检验码并写入文件");
            
            InputStream in = new FileInputStream(file);
            File MD5File = new File(zipFilePath + "checkcode_MD5.txt");
            FileWriter fileWriter = new FileWriter(MD5File);
            String md5Hex = DigestUtils.md5Hex(in);
            fileWriter.write(md5Hex);
            
            log.info("{}的MD5检验码为:{}", zipFilePath, md5Hex);
            
            fileWriter.close();
            in.close();
            
            return MD5File.getAbsolutePath();
        } catch (IOException e) {
            log.error("生成MD5文件时发生异常,异常原因为:{}", e.getMessage());
            throw new ServiceException("生成MD5文件时发生异常错误");
        }
    }

最后生成的Md5与下载下来的zip包的MD5码一致

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值