这边小白实现思路为先要下载的文件压缩到本地为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码一致
![](https://i-blog.csdnimg.cn/blog_migrate/7123fd52b64145c658e9f3e9e46de274.png)