public void downloadZipForLandErrorEntListByLandUpErrorCriteria(
LandUpErrorCriteria landUpErrorCriteria, HttpServletResponse response,
HttpServletRequest httpServletRequest) throws IOException {
//查询全部分页数据,用于导出
PageWrapper<LandUpErrorDto> page = new PageWrapper<>();
page.setPageNum(1);
page.setPageSize(Integer.MAX_VALUE - 1);
PageWrapper<LandUpErrorDto> pageList = (PageWrapper<LandUpErrorDto>) this
.getLandErrorEntListByLandUpErrorCriteriaPageList(landUpErrorCriteria, page).getData();
List<LandUpErrorDto> dataList =
CollectionUtils.isNotEmpty(pageList.getResults()) ? pageList.getResults() : null;
//校验查询结果是否为空
if (CollectionUtils.isNotEmpty(dataList)) {
try {
String zipName = "异常用地企业清单及佐证材料.zip";
//设置相关属性,否则容易出现下载的文件名是乱码或下划线
String agent = httpServletRequest.getHeader("User-Agent").toLowerCase();
if (agent.contains("msie") || agent.contains("like gecko")) {
// win10 ie edge 浏览器 和其他系统的ie
zipName = URLEncoder.encode(zipName, "UTF-8");
} else {
// fe
zipName = new String(zipName.getBytes("UTF-8"), "iso-8859-1");
}
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment; fileName=" + zipName);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
Date curDate = new Date(System.currentTimeMillis());
String timeStr = formatter.format(curDate);
BufferedInputStream bis = null;
try {
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
OSSClient ossClient = new OSSClient(OssConfig.END_POINT, OssConfig.ACCESS_KEY_ID,
OssConfig.ACCESS_KEY_SECRET);
//根据分页数据中每一条记录中的oss地址(多个文件,多个地址)
for (LandUpErrorDto dto : dataList) {
List<String> fileNames = new ArrayList<>();
if (StringUtils.isNotBlank(dto.getOssUrl())) {
List<String> urlList = Arrays.asList(dto.getOssUrl().split(","));
fileNames.addAll(urlList);
}
int sortNum = 1;
for (String fileName : fileNames) {
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(
OssConfig.BUCKET_NAME_OSS, fileName, HttpMethod.GET);
// 设置过期时间。
request.setExpiration(expiration);
// 生成签名URL(HTTP GET请求)。
URL signedUrl = ossClient.generatePresignedUrl(request);
// 使用签名URL发送请求。
OSSObject ossObject = ossClient.getObject(signedUrl, new HashMap<>());
if (ossObject != null) {
InputStream inputStream = ossObject.getObjectContent();
byte[] buffs = new byte[1024 * 10];
String[] strArray = fileName.split("\\.");
int suffixIndex = strArray.length - 1;
//zipFile 对应oss下载的文件在写入压缩包时重新命名的文件名
String zipFile =
dto.getEntName() + "_" + timeStr + "_" + sortNum + "." + strArray[suffixIndex];
ZipEntry zipEntry = new ZipEntry(zipFile);
zos.putNextEntry(zipEntry);
bis = new BufferedInputStream(inputStream, 1024 * 10);
//读写操作
int read;
while ((read = bis.read(buffs, 0, 1024 * 10)) != -1) {
zos.write(buffs, 0, read);
}
ossObject.close();
}
sortNum++;
}
}
//补充本地生成的excel文件
File excelFile = null;
try (InputStream resourceAsStream = httpServletRequest.getServletContext()
.getClassLoader().getResourceAsStream("template/landUpErrorEntData.xlsx");
Workbook workbook = landUpErrorService
.downloadLandErrorEntListByLandUpErrorCriteria(dataList, resourceAsStream);) {
//workbook转成输入流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
workbook.write(bos);
ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
//压缩包内创建一个空文件
excelFile = new File(CommonConfig.UPLOAD_PATH + "异常用地企业清单.xlsx");
//读入需要下载的文件的内容,打包到zip文件
zos.putNextEntry(new ZipEntry(excelFile.getName()));
int dataLen;
byte[] buffer = new byte[1024];
while ((dataLen = bais.read(buffer)) > 0) {
zos.write(buffer, 0, dataLen);
}
//关闭流
bos.close();
bais.close();
}
//关闭压缩包打包
zos.closeEntry();
zos.flush();
zos.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭流
try {
if (null != bis) {
bis.close();
}
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
logger.error("==========用地异常zip下载失败", e);
}
}
}
导出zip,本地生成文件和OSS下载文件整合
于 2022-01-26 10:46:30 首次发布