带附件下载的时候,双击ZIP文件提示失效,但是可以解压;不带附件下载的时候,双击ZIP文件,可以直接打开,具体是哪里有错误,麻烦各位指教一下
public ModelAndView dowmSelFileAndLaws(String selIds, String lawsApplyModule, String hasLawsApplyModule, String name, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.setView(new DownloadView());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 创建一个ZipOutputStream对象
ZipOutputStream zipOut = new ZipOutputStream(baos, StandardCharsets.UTF_8);
zipOut.setMethod(ZipOutputStream.DEFLATED);
zipOut.setLevel(Deflater.DEFAULT_COMPRESSION);
List<String>tmpIds = Lists.newArrayList();
if (StringUtils.isNotEmpty(selIds)) {
tmpIds = Arrays.asList(selIds.split(","));
if (tmpIds != null && tmpIds.size() > 0) {
if (tmpIds.size() == 1) {
LawsDetailsDto dto = new LawsDetailsDto();
dto.setLawId(tmpIds.get(0));
dto.setLawsApplyModule(lawsApplyModule);
dto.setHasLawsApplyModule(hasLawsApplyModule);
LawDownDto lawDownDto = lawsSearchService.getLawDownDto(dto);
// 下载法规 doc 文档
InputStream lawInputStream = lawsSearchService.getLawInputStream(lawDownDto, dto);
ZipEntry zipLawsEntry = new ZipEntry(lawDownDto.getLawsName() + ".docx");
zipOut.putNextEntry(zipLawsEntry);
byte[] buffer = new byte[1024];
int lenLaws;
while ((lenLaws = lawInputStream.read(buffer)) > 0) {
zipOut.write(buffer, 0, lenLaws);
}
lawInputStream.close();
//获取附件
if (lawDownDto.getAttFiles() != null) {
for (Map.Entry<String, String> entry : lawDownDto.getAttFiles().entrySet()) {
AttachmentExample example = new AttachmentExample();
example.createCriteria().andAttNameEqualTo(entry.getKey());
List<Attachment> attachmentList = attachmentMapper.selectByExample(example);
for (Attachment attachment : attachmentList) {
fileService.countDownloadNum(attachment.getId(), "true");
Map<String, Object> fileInfo = fileService.getCloudFileInfo(attachment.getId());
ZipEntry zipFileEntry = new ZipEntry(fileInfo.get("fileName") + ".docx");
zipOut.putNextEntry(zipFileEntry);
byte[] bufferFile = new byte[1024];
int lenFile;
InputStream is = (InputStream) fileInfo.get("fileBytes");
while ((lenFile = is.read(bufferFile)) > 0) {
zipOut.write(bufferFile, 0, lenFile);
}
is.close();
}
}
zipOut.closeEntry();
// 将生成的ZIP文件写入一个ByteArrayOutputStream对象中
zipOut.finish();
byte[] bytes = baos.toByteArray();
baos.write(bytes, 0, bytes.length);
baos.flush();
baos.close();
// 将ByteArrayOutputStream对象转换为一个ByteArrayInputStream对象
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
mv.addObject(DownloadView.EXPORT_FILE, bais);
mv.addObject(DownloadView.EXPORT_FILE_NAME, lawDownDto.getLawsName() + ".zip");
mv.addObject(DownloadView.EXPORT_FILE_TYPE, MediaType.ZIP.toString());
mv.setView(new DownloadView());
response.setHeader("fileName", java.net.URLEncoder.encode(lawDownDto.getLawsName() + ".zip", "utf-8"));
} else {
zipOut.closeEntry();
// 将生成的ZIP文件写入一个ByteArrayOutputStream对象中
zipOut.finish();
byte[] bytes = baos.toByteArray();
baos.write(bytes, 0, bytes.length);
baos.flush();
baos.close();
// 将ByteArrayOutputStream对象转换为一个ByteArrayInputStream对象
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
mv.addObject(DownloadView.EXPORT_FILE, bais);
mv.addObject(DownloadView.EXPORT_FILE_NAME, lawDownDto.getLawsName() + ".docx");
mv.addObject(DownloadView.EXPORT_FILE_TYPE, DownloadView.FILE_TYPE.DOCX);
mv.setView(new DownloadView());
response.setHeader("fileName", java.net.URLEncoder.encode(lawDownDto.getLawsName() + ".docx", "utf-8"));
}
} else {
//多选,最后肯定是一整个压缩包,1有附件,里面就带文件夹(法规文档+附件),2无附件,里面法规docx,最后把这些都放到压缩包中
//循环开始
for (String lawsId : tmpIds) {
LawsDetailsDto dto = new LawsDetailsDto();
dto.setLawId(lawsId);
dto.setLawsApplyModule(lawsApplyModule);
dto.setHasLawsApplyModule(hasLawsApplyModule);
//根据传来的查看基本信息
LawDownDto lawDownDto = lawsSearchService.getLawDownDto(dto);
// 判断是否有附件
if (lawDownDto.getAttFiles() != null) {
// 创建一个文件夹,用于存放法规和附件的doc文件
String folderName = lawDownDto.getLawsName();
ZipEntry folderEntry = new ZipEntry(folderName + "/");
zipOut.putNextEntry(folderEntry);
//把法规文件放到这个文件夹中
InputStream lawInputStream = lawsSearchService.getLawInputStream(lawDownDto, dto);
ZipEntry zipLawsEntry = new ZipEntry(folderName + "/" + lawDownDto.getLawsName() + ".docx");
zipOut.putNextEntry(zipLawsEntry);
byte[] buffer = new byte[1024];
int lenLaws;
while ((lenLaws = lawInputStream.read(buffer)) > 0) {
zipOut.write(buffer, 0, lenLaws);
}
lawInputStream.close();
//把附件文件放到这个文件夹中
for (Map.Entry<String, String> entry : lawDownDto.getAttFiles().entrySet()) {
AttachmentExample example = new AttachmentExample();
example.createCriteria().andAttNameEqualTo(entry.getKey());
List<Attachment> attachmentList = attachmentMapper.selectByExample(example);
for (Attachment attachment : attachmentList) {
fileService.countDownloadNum(attachment.getId(), "true");
Map<String, Object> fileInfo = fileService.getCloudFileInfo(attachment.getId());
ZipEntry zipFileEntry = new ZipEntry(folderName + "/" + attachment.getAttName());
zipOut.putNextEntry(zipFileEntry);
byte[] bufferFile = new byte[1024];
int lenFile;
InputStream is = (InputStream) fileInfo.get("fileBytes");
while ((lenFile = is.read(bufferFile)) > 0) {
zipOut.write(bufferFile, 0, lenFile);
}
is.close();
zipOut.closeEntry();
}
}
} else {
//没附件
//下载法规 doc 文档
InputStream lawInputStream = lawsSearchService.getLawInputStream(lawDownDto, dto);
ZipEntry zipLawsEntry = new ZipEntry(lawDownDto.getLawsName() + ".docx");
zipOut.putNextEntry(zipLawsEntry);
byte[] buffer = new byte[1024];
int lenLaws;
while ((lenLaws = lawInputStream.read(buffer)) > 0) {
zipOut.write(buffer, 0, lenLaws);
}
lawInputStream.close();
zipOut.closeEntry();
}
}
// 在循环外部调用 finish() 方法,将所有法规和附件的压缩文件写入到字节数组中
zipOut.finish();
byte[] bytes = baos.toByteArray();
baos.write(bytes, 0, bytes.length);
baos.flush();
baos.close();
// 将ByteArrayOutputStream对象转换为一个ByteArrayInputStream对象
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
String fileName = null;
if (StringUtils.isNotEmpty(name)) {
fileName = "[" + name + "号法规文件]";
} else {
fileName = "所选法规文件及附件下载" + System.currentTimeMillis();
}
if (StringUtils.isNotBlank(fileName)) {
fileName = new String(fileName.getBytes(), "utf-8");
}
mv.addObject(DownloadView.EXPORT_FILE, bais);
mv.addObject(DownloadView.EXPORT_FILE_NAME, fileName + ".zip");
mv.addObject(DownloadView.EXPORT_FILE_TYPE, MediaType.ZIP);
mv.setView(new DownloadView());
response.setHeader("fileName", java.net.URLEncoder.encode(fileName + ".zip", "utf-8"));
}
}
}
return mv;
}