场景:

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

遇到的问题:

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

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

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

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

def test():
req = requests.get('http://www.xxx.com.cn')
req.encoding = req.apparent_encoding
try:
www = req.content.decode("gbk").encode("utf-8")
except(UnicodeDecodeError, )as e:
www = req.content.decode("gb2312").encode("utf-8")
import gzip
ww = gzip.compress(www)
base64_encrypt = base64.b64encode(ww)
result = base64_encrypt.decode()
print(result) # 解
result2 = base64.b64decode(result)
qq = gzip.decompress(result2)
ee = qq.decode(encoding="utf-8")
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 有截断,占用空间大了点)

package test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.*; public class basegziptest { /**
* @param str
* @return 解压缩
*/
public static String uncompress(String str) {
if (str == null || str.length() == 0) {
return str;
}
ByteArrayOutputStream out = null;
ByteArrayInputStream in = null;
GZIPInputStream gzip = null;
String uncompress = "";
try {
out = new ByteArrayOutputStream();
new Base64();
// 这里增加base64解码
byte[] compressed = Base64.decodeBase64(str);
in = new ByteArrayInputStream(compressed);
byte[] buffer = new byte[1024];
gzip = new GZIPInputStream(in); while(true) {
int offset = -1;
try{offset = gzip.read(buffer);}catch(EOFException ex){}
if(offset!=-1){
out.write(buffer, 0, offset);
}else{
break;
}
} uncompress = out.toString("UTF-8");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != gzip) {
try {
gzip.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != out) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return uncompress;
} public static void main(String[] args) throws IOException { String str1 = "H4sIACiZFV4C/yssTy0qqSzNzC/Iyc7KSE9LKUQXKE6sqkhOLkvKyx2uUggWAPPOXiQOAQAA";
String str = "H4sIALimFV4C/91a63PbVBb/DDP8D14xy8B4iGRJlm2Is+PI8it+W3Zsf+noaSnWw5bk56eWpaWldNNM2QbaAi2wdBdoSpdHk6aFf8ayk0/8C3v9SOqkKU2XpGRX47F0r+49Ouf3u+ecq3v1ysuvvDz7p2CKpEtpyhGhE3FHOj8fj5IO6E0YXsRIGA7SwfENfAZx0AajmbIl6xqjwDCVhBxzQIBkqcroLDA8ODvAMWvJliLM9e99tnVxeXDjjL35YGvtZ/v+Pwb/vNi/eL1/873Bo5VZeNxq0kUVLMahMargh8JUksoG6FQWcnC6Zgma5YcSMmfopi5ajoJsNhjFkbMavKw7ZpIU7fDMuKAD5JCpIHUqHkiG84EwNSWLfPWg1k3zFC+ITEOxSEUG7XKcIdesqW4xpslMKg/ubjFGRQD9JEFlpvpJllV7C4bNUb05o+5YMsPpKiyDRooim4JmCrAsuHdFK7JWdUiGIPqhmRkY/DjThHNWRxHMGXAJOaxODTzWEtoWPCobguK";
System.out.println("原长度:" + str.length());
System.out.println("压缩后内容:" + str);
System.out.println("解压后内容:" + basegziptest.uncompress(str));
} }

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. 洛谷$P4099\ [HEOI2013]\ SAO\ dp$

    正解:树形$dp$ 解题报告: 传送门$QwQ$. 考虑设$f_i$表示点$i$的子树内的拓扑序排列方案数有多少个. 发现这样不好合并儿子节点和父亲节点.于是加一维,设$f_{i,j}$表示点$i$的 ...

  2. 20行Python代码爬取王者荣耀全英雄皮肤

    引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 ...

  3. 理解 RESTful API 设计规范

    RESTful是目前最流行的API设计规范,它是用于Web数据接口的设计.从字面可以看出,他是Rest式的接口,所以我们先了解下什么是Rest. REST与技术无关,它代表的是一种软件架构风格,RES ...

  4. Wireshark抓包,带你快速入门

    前言 关于抓包我们平时使用的最多的可能就是Chrome浏览器自带的Network面板了(浏览器上F12就会弹出来).另外还有一大部分人使用Fiddler,Fiddler也是一款非常优秀的抓包工具.但是 ...

  5. linux入门系列3--常见的linux远程登陆管理工具

    服务器一般是云服务器或者放置在机房,我们日常工作中通过远程连接工具连接到服务器进行操作,这类工具很多(如SecureCRT.XShell.Putty.FinallShell.TeamViewer以及w ...

  6. UCI 人口收入数据分析(python)

    一.项目介绍 UCI上有许多免费的数据集可以拿来练习,可以在下面的网站找寻 http://archive.ics.uci.edu/ml/datasets.html 这次我使用的是人口收入调查,里面会有 ...

  7. Django框架之数据库ORM框架

    首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮 ...

  8. Spring中的beanPostProcess的作用

    BeanPostProcessor是Spring框架中非常重要的bean之一.贯穿在Spring容器中bean的初始化的整个过程. Spring中的beanpostProcess体系结构如下: 可以看 ...

  9. 记录一下第一次用markdown写博客回滚过程

    前面写博客,一直用的是博客园的TinyMCE编辑器, 今天不知道哪根筋搭牢了,想试试用Markdown写. 于是在“选项”里面把默认编辑器修改为“Markdown”,鉴于本人有一定的Markdown基 ...

  10. EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

    前言 上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析,是不是有点意犹未尽的感觉,是的,我也有这种感觉,看到这里相信您和我会有一些疑惑,要是我们接下来通过注解.Fluent APi.DbSet分 ...