场景:

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. appium整个环境安装详细教程(重要)

    环境依赖 Node.js Appium Appium-desktop Appium-doctor Appium-Python-Client Python JDK Andriod SDK 以上所需的软件 ...

  2. 「洛谷P1080」「NOIP2012提高组」国王游戏 解题报告

    P1080 国王游戏 题目描述 恰逢 \(H\)国国庆,国王邀请\(n\)位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 \( ...

  3. 高斯消去法解线性方程组(MPI)

    用一上午的时间,用MPI编写了高斯消去法解线性方程组.这次只是针对单线程负责一个线程方程的求解,对于超大规模的方程组,需要按行分块,后面会在这个基础上进行修改.总结一下这次遇到的问题: (1)MPI_ ...

  4. 从0开发3D引擎(四):搭建测试环境

    目录 上一篇博文 了解自动化测试 单元测试 集成测试 端对端测试 通过打印日志来调试 了解运行测试 断点调试 通过Spector.js测试WebGL 通过log调试Shader 移动端测试 了解性能测 ...

  5. oop(面向对象语言的三大特征):封装,继承,多态; (抽象),函数绑定

    封装/隐藏 : 通过类的访问限定符实现的   private    public 继承的意义之一:代码的复用 类的继承是指在一个现有类的基础上去构建一个新的类,构造出来的新类被称为派生类(子类),现有 ...

  6. Apache Hudi使用问题汇总(一)

    1.如何写入Hudi数据集 通常,你会从源获取部分更新/插入,然后对Hudi数据集执行写入操作.如果从其他标准来源(如Kafka或tailf DFS)中提取数据,那么DeltaStreamer将会非常 ...

  7. 通过VS2019使用Web部署发布.net core程序

    服务器:Windows Server2012R2 服务器已安装好IIS 需要启用Web Management Service  与 Web部署代理服务 服务器默认是没有Web部署代理服务的  需要安装 ...

  8. crontab里的特殊符号%导致命令不能执行

    有群里的小伙伴说crontab里的任务不执行,具体是这样的 * * * * /bin/date "+%Y-%m-%d %H:%M:%S" >>/data/tmp/tes ...

  9. python requests 库 首次使用

    安装requests库 执行pip3 install requests 使用resquests库获取百度网站首页 打开python idle终端.以python3为例,在终端执行python3并回车. ...

  10. javaweb-codereview 学习记录-3

    Class类加载流程 实际上就是ClassLoader将会调用loadclass来尝试加载类,首先将会在jvm中尝试加载我们想要加载的类,如果jvm中没有的话,将调用自身的findclass,此时要是 ...