场景:

python获取到网页,把网页gzip打包,并Base64编码保存; 由java负责Base64解码并解压二进制成html

遇到的问题:

1、python 的request,缺省就把gzip响应包解压了,导致有一次损耗(解压的html再次压缩),时间关系,没有解决这个问题

2、python错误理解了二进制转base64,将二进制变成字符串后才base64编码,就没有起到压缩的意义,报文大小还更大了。

3、html有GB2312 GBK的, 如果希望 后端处理轻松,需要在获取是就转义成UTF8,保证内容编码的一致性

4、python没有做一次完整压缩编码, 和 解码解压的流程,验证html是否真的可以还原。 需要自我验证一次闭环操作

  1. def test():
  2. req = requests.get('http://www.xxx.com.cn')
  3. req.encoding = req.apparent_encoding
  4. try:
  5. www = req.content.decode("gbk").encode("utf-8")
  6. except(UnicodeDecodeError, )as e:
  7. www = req.content.decode("gb2312").encode("utf-8")
  8. import gzip
  9. ww = gzip.compress(www)
  10. base64_encrypt = base64.b64encode(ww)
  11. result = base64_encrypt.decode()
  12. print(result)
  13.  
  14. # 解
  15. result2 = base64.b64decode(result)
  16. qq = gzip.decompress(result2)
  17. ee = qq.decode(encoding="utf-8")
  18. print(ee)

  

后端采用java处理html:

1、java解压出现报错,第一时间,没用简单的英文字符串先验证解压算法的正确性

2、java解压中文html报错:java.io.EOFException: Unexpected end of ZLIB input stream ,网上解决方案很多不靠谱,最后确认原因是 二进制流处理上要保护最后一次空读

参考源:  https://blog.csdn.net/qwfylwc/article/details/54580502

3、java解压代码从网上copy,大多数是对文件流的处理,没有对字符串的处理,可借鉴性少。

分享的代码里

1、验证了英文压缩编码的    解码解压正确性(str1)

2、验证了中文html的 解码解压正确性(str 有截断,占用空间大了点)

  1. package test;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.EOFException;
  6. import java.io.IOException;
  7. import java.util.zip.GZIPInputStream;
  8. import java.util.zip.GZIPOutputStream;
  9. import org.apache.commons.codec.binary.*;
  10.  
  11. public class basegziptest {
  12.  
  13. /**
  14. * @param str
  15. * @return 解压缩
  16. */
  17. public static String uncompress(String str) {
  18. if (str == null || str.length() == 0) {
  19. return str;
  20. }
  21. ByteArrayOutputStream out = null;
  22. ByteArrayInputStream in = null;
  23. GZIPInputStream gzip = null;
  24. String uncompress = "";
  25. try {
  26. out = new ByteArrayOutputStream();
  27. new Base64();
  28. // 这里增加base64解码
  29. byte[] compressed = Base64.decodeBase64(str);
  30. in = new ByteArrayInputStream(compressed);
  31. byte[] buffer = new byte[1024];
  32. gzip = new GZIPInputStream(in);
  33.  
  34. while(true) {
  35. int offset = -1;
  36. try{offset = gzip.read(buffer);}catch(EOFException ex){}
  37. if(offset!=-1){
  38. out.write(buffer, 0, offset);
  39. }else{
  40. break;
  41. }
  42. }
  43.  
  44. uncompress = out.toString("UTF-8");
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. } finally {
  48. if (null != gzip) {
  49. try {
  50. gzip.close();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. if (null != in) {
  56. try {
  57. in.close();
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. if (null != out) {
  63. try {
  64. out.close();
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. }
  70. return uncompress;
  71. }
  72.  
  73. public static void main(String[] args) throws IOException {
  74.  
  75. String str1 = "H4sIACiZFV4C/yssTy0qqSzNzC/Iyc7KSE9LKUQXKE6sqkhOLkvKyx2uUggWAPPOXiQOAQAA";
  76. String str = "H4sIALimFV4C/91a63PbVBb/DDP8D14xy8B4iGRJlm2Is+PI8it+W3Zsf+noaSnWw5bk56eWpaWldNNM2QbaAi2wdBdoSpdHk6aFf8ayk0/8C3v9SOqkKU2XpGRX47F0r+49Ouf3u+ecq3v1ysuvvDz7p2CKpEtpyhGhE3FHOj8fj5IO6E0YXsRIGA7SwfENfAZx0AajmbIl6xqjwDCVhBxzQIBkqcroLDA8ODvAMWvJliLM9e99tnVxeXDjjL35YGvtZ/v+Pwb/vNi/eL1/873Bo5VZeNxq0kUVLMahMargh8JUksoG6FQWcnC6Zgma5YcSMmfopi5ajoJsNhjFkbMavKw7ZpIU7fDMuKAD5JCpIHUqHkiG84EwNSWLfPWg1k3zFC+ITEOxSEUG7XKcIdesqW4xpslMKg/ubjFGRQD9JEFlpvpJllV7C4bNUb05o+5YMsPpKiyDRooim4JmCrAsuHdFK7JWdUiGIPqhmRkY/DjThHNWRxHMGXAJOaxODTzWEtoWPCobguK";
  77. System.out.println("原长度:" + str.length());
  78. System.out.println("压缩后内容:" + str);
  79. System.out.println("解压后内容:" + basegziptest.uncompress(str));
  80. }
  81.  
  82. }

html网页压缩保存到数据库,减少空间占用,实现过程遇到的解压问题的更多相关文章

  1. winform程序压缩文件上传,服务器端asp.net mvc进行接收解压

    期间编程没什么难度,唯一可能忽略导致结果失败是asp.net  mvc配置 对于压缩文件大的话,需要配置mvc的最大接收量: <system.web> <httpRuntime ma ...

  2. 解决MOFH免费空间cpanel面板大文件无法解压的情况

    解决办法: 解压大文件,重新压缩为tar格式的压缩格式,这样可以更小,而且也可以在cpanel面板解压,记得使用filezilla软件上传文件,在cpanel的网页界面不要刷新,一刷新就不可以解压大文 ...

  3. 将爬取的网页数据保存到数据库时报错不能提交JPA,Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB6 \xE2...' for column 'content' at row 1

    错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实 ...

  4. Unity3D研究院之LZMA压缩文件与解压文件

    原地址:http://www.xuanyusong.com/archives/3095 前两天有朋友告诉我Unity的Assetbundle是LZMA压缩的,刚好今天有时间那么就研究研究LZMA.它是 ...

  5. [转帖]Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压

    Linux操作系统中,*.zip.*.tar.*.tar.gz.*.tar.bz2.*.tar.xz.*.jar.*.7z等格式的压缩与解压 https://blog.csdn.net/gatieme ...

  6. zip unzip tar 压缩解压

    yum install -y unzip zip    yum安装zip -r mydata.zip mydata    mydata目录压缩为mydata.zipunzip mydata.zip - ...

  7. Linux命令学习(4):gzip压缩与解压

    版权声明:本文为博主原创文章,未经允许不得转载 引子 gzip是Linux系统中最常用也是高效的压缩压缩命令.早期Linux系统中主要使用compress命令压缩,得到后缀为“.Z”的压缩文件,但是后 ...

  8. 【Linux命令】Linux压缩及解压命令

    Linux压缩及解压命令 一.文件打包和压缩命令介绍 linux系统文件压缩格式,常用的有*.tar.gz.*.gz.*.zip.*.tar,还有*.rar..7z..bz2..tar.xz..tar ...

  9. 压缩及解压命令gzip、bzip2、tar

    1. gzip 描述:压缩与解压缩 用法:gzip[选项]...[文件名称]... 选项:-d 解压 gzip hello.txt     # 文件压缩后名为hello.txt.gz gzip -d ...

随机推荐

  1. Qt5 http/HTTPS访问 以及JSON解析的实用

    实用QT5访问HTTP/以及HTTPS协议访问 并且调用Json解析 #include "mywidget.h" #include "ui_mywidget.h" ...

  2. 「CF86D」Powerful array 解题报告

    题面 给出一个\(n\)个数组成的数列\(a\),有\(t\)次询问,每次询问为一个\([l,r]\)的区间,求区间内每种数字出现次数的平方×数字的值 的和 思路: 直接上莫队咯 然后就T了 没学过莫 ...

  3. 「Luogu P2015」二叉苹果树 解题报告

    题面 一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大 还看不懂?-- 2 5 input:5 ...

  4. ECOS问题解决记录

    1.finder自定义列 http://club.ec-os.net/doc/ecos/framework-ecos/advance/desktop/dev.html#id5 2.命令行工具 地址 h ...

  5. linux下挂载硬盘出错的解决方法

    我的电脑是 Uuntu16.04 + win10 双系统,今天在Ubuntu中打开D盘时报错 Error mounting /dev/sda5 原因是D盘的格式是ntfs,在linux中会出现不识别的 ...

  6. Alibaba Nacos 服务发现组件集群部署

    前面学习了单机模式下的启动,生产环境中部署nacos肯定是使用集群模式cluster保证高可用. 官方文档的集群部署推荐使用VIP+域名模式,把所有服务列表放到一个vip下面,然后挂到一个域名下面. ...

  7. 关于爬虫的日常复习(14)—— 爬虫beautifulsoup的初级高级的基本用法

  8. Linux下利用Ant调用Jmeter脚本生成HTML测试报告

    今天我们学习如何利用Ant调用Jmeter脚本,并将生成的 jtl 文件转换为 HTML 格式的测试报告. 准备工作 需要在Linux上提前安装好 JDK. Jmeter 和 Ant. 1,JDK(可 ...

  9. Scala 学习(4)之「类——基本概念2」

    目录 内部类 extends override和super override field isInstanceOf和asInstanceOf getClass和classOf 内部类 import s ...

  10. python super()函数:调用父类的构造方法

    python子类会继承父类所有的类属性和类方法.严格来说,类的构造方法其实就是实例方法,因此,父类的构造方法,子类同样会继承. 我们知道,python是一门支持多继承的面向对象编程语言,如果子类继承的 ...