工具类封装实战(三)不解压修改压缩文件

举报
小鲍侃java 发表于 2021/09/09 23:58:47 2021/09/09
【摘要】 /** * 图片输出使用(现在earlying中模板使用) * * @param fileMessage * @return * @throws UnsupportedEncodingException */ @GetMapping("/downloadApplication") ...

  
  1. /**
  2. * 图片输出使用(现在earlying中模板使用)
  3. *
  4. * @param fileMessage
  5. * @return
  6. * @throws UnsupportedEncodingException
  7. */
  8. @GetMapping("/downloadApplication")
  9. public String downloadApplication(FileMessage fileMessage) throws Exception {
  10. // 获取HttpServletResponse
  11. HttpServletResponse response =
  12. ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
  13. // 下载路径
  14. String downUrl = fileMessage.getFileDownloadUri();
  15. if (downUrl != null) {
  16. // 复制模板文件 生成uuid服务名
  17. UUID uuid = UUID.randomUUID();
  18. String newRarFile = "/home/common_files/" + uuid + ".zip";
  19. // 开始复制
  20. updateZipFile(downUrl, newRarFile, fileMessage.getId());
  21. // 设置文件路径
  22. File file = new File(newRarFile);
  23. if (file.exists()) {
  24. byte[] buffer = new byte[1024];
  25. FileInputStream fis = null;
  26. BufferedInputStream bis = null;
  27. try {
  28. fis = new FileInputStream(file);
  29. bis = new BufferedInputStream(fis);
  30. OutputStream os = response.getOutputStream();
  31. int i = bis.read(buffer);
  32. while (i != -1) {
  33. os.write(buffer, 0, i);
  34. i = bis.read(buffer);
  35. }
  36. return "";
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. } finally {
  40. if (bis != null) {
  41. try {
  42. bis.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. if (fis != null) {
  48. try {
  49. fis.close();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. }
  56. }
  57. return "";
  58. }
  59. public void updateZipFile(String inputName, String outPutName, String id) throws IOException {
  60. ZipFile zipFile = new ZipFile(inputName);
  61. // 复制为新zip
  62. ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outPutName));
  63. // 遍历所有文件复制
  64. for (Enumeration e = zipFile.entries(); e.hasMoreElements();) {
  65. ZipEntry entryIn = (ZipEntry)e.nextElement();
  66. if (!entryIn.getName().equalsIgnoreCase("myMapApp/config.js")) {
  67. // zos.putNextEntry(entryIn);
  68. zos.putNextEntry(new ZipEntry(entryIn.getName()));
  69. InputStream is = zipFile.getInputStream(entryIn);
  70. byte[] buf = new byte[1024];
  71. int len;
  72. while ((len = is.read(buf)) > 0) {
  73. zos.write(buf, 0, (len < buf.length) ? len : buf.length);
  74. }
  75. }
  76. // 当前文件需要复写
  77. else {
  78. zos.putNextEntry(new ZipEntry("myMapApp/config.js"));
  79. InputStream is = zipFile.getInputStream(entryIn);
  80. byte[] buf = new byte[1024 * 5];
  81. int len;
  82. while ((len = (is.read(buf))) > 0) {
  83. String s = new String(buf);
  84. if (s.contains("let appid=")) {
  85. buf = s.replaceAll("let appid=", "let appid=\"" + id + "\"").getBytes();
  86. s = s.replaceAll("let appid=", "let appid=\"" + id + "\"");
  87. }
  88. if (s.contains("let service=")) {
  89. buf = s.replaceAll("let service=", "let service=\"" + instanceId + "\"").getBytes();
  90. }
  91. zos.write(buf, 0, (len < buf.length) ? len : buf.length);
  92. }
  93. }
  94. zos.closeEntry();
  95. }
  96. zos.close();
  97. }

这里有一个问题


   
  1. zos.putNextEntry(entryIn); 这行代码会报错 --java.util.zip.ZipException: invalid entry compressed size (expected 1466196 but got 1499165 bytes)
  2. 原因是复制过程中 压缩方式不同导致流的字节对应不上 所以需要用以下代码。
  3. zos.putNextEntry(new ZipEntry(entryIn.getName()));

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/108216731

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。