/**
*
* @param id
* @param response
*/
@Override
public void download(Long id, HttpServletResponse response) {
Response responseFe;
//设置响应头信息
response.reset(); //清除缓存
response.setCharacterEncoding("utf-8"); //设置编码
response.setContentType("multipart/form-data");//设置发送到客户端的响应的内容类型(如果响应尚未提交)。给定的内容类型可以包括字符编码规范
//构建下载的数据
ResourceArea resourceArea = super.getById(id); //查询要下载的文件
//设置压缩包的名字
String downloadName = "压缩包" + resourceArea.getAreaTitle() + ".zip";
//设置压缩流:直接写入response,实现边压缩边下载
ZipOutputStream zipOutputStream = null;
//循环将文件写入压缩流
DataOutputStream os = null;
try {
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadName, "utf-8"));
zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
//设置压缩方法
zipOutputStream.setMethod(ZipOutputStream.DEFLATED);
//应该先把子集找出来,分别吧每个子集关联的构建找出来 吧每个子集压缩成一个文件,然后把每个子集压缩后的文件打包到压缩包中
ResourceAreaVo areaVo = new ResourceAreaVo();
areaVo.setDelFlag("0");// 未删除
areaVo.setCommitFlag(2L);//审批通过
areaVo.setShelfStatus(1L);//已上架
areaVo.setParentId(id);
//查询一级分类下面的二级分类
List<ResourceAreaVo> areaVoList = resourceAreaMapper.selectResourceAreaList(areaVo);
if(StringUtils.isNotEmpty(areaVoList)){
//查询二级分类下面的构建信息
ResourceProduct resourceProduct = new ResourceProduct();
resourceProduct.setDelFlag("0"); //未删除
resourceProduct.setProductState(2); //审核通过
for (ResourceAreaVo resourceAreaVo : areaVoList) {
resourceProduct.setBusinessId(resourceAreaVo.getId());
//构建列表
List<ResourceProduct> projectlist = resourceProductService.selectResourceProductList(resourceProduct);
//遍历文件信息(主要获取文件名/文件路径等)
for (ResourceProduct product : projectlist) {
//获取构建关联的文件
List<FileMessageVo> byProductId = resourceFilemessageService.getByProductId(product.getId());
for (FileMessageVo fileMessageVo : byProductId) {
try {
//查询的文件返回的是文件流
responseFe = minioServiceClient.downLoad(oauthUtil.getToken(), fileMessageVo.getFileId());
//将文件写入压缩流
addToZipFile(resourceAreaVo.getAreaTitle(),fileMessageVo.getFileName(), zipOutputStream, os, responseFe);
} catch (Exception e) {
log.error("下载文件出错![{}]"+e.getMessage());
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭流
try {
if (os != null) {
os.flush();
os.close();
}
if (zipOutputStream != null) {
zipOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* @param folderName 文件夹名
* @param fileName 文件名
* @param zipOutputStream 压缩流
* @param os 输出流
* @param response 文件流
* @throws IOException
*/
private static void addToZipFile(String folderName,String fileName, ZipOutputStream zipOutputStream,DataOutputStream os,Response response) throws IOException {
// 创建ZipEntry对象并设置文件名
ZipEntry entry = new ZipEntry(folderName+"/"+fileName);
zipOutputStream.putNextEntry(entry);
os = new DataOutputStream(zipOutputStream);
InputStream inputStream = response.body().asInputStream();
byte[] b = new byte[100];
int length;
//读入需要下载的文件的内容,打包到zip文件
while ((length = inputStream.read(b)) != -1) {
os.write(b, 0, length);
}
//关闭流
inputStream.close();
zipOutputStream.closeEntry();
}
java下载文件并压缩,一个类别的文件放到同一个文件夹下面
最新推荐文章于 2025-03-06 17:38:44 发布