最近在页面上有个显示数据表格的功能,数据由后台传给前台JS表格插件。数据格式为JSON
由于数据量很大,就想到用GZIP压缩以后传给前台。压缩前,某个表格的数据量达到3M多,用GZIP压缩后就200K左右。
业务流程是:先检查缓存中是否有静态文件,如果没有就从数据库中读出来然后保存成文件。这个过程中,我用GZIP先进行了压缩,然后保存。然后再下次读的时候直接读取这个文件。
问题是,读取静态文件之后浏览器却无法正确解码,报ERR_CONTEN_DECODING_FAILED。我在网上搜索了一下原因,有说是文件中存在BOM头,会导致解码失败,经检查生成文件的PHP没有BOM头。期间,怀疑是文件编码的问题,于是用Editplus尝试打开,刚打开提示要选择编码方式,于是选择了UTF8,结果还是不行。
当我将gzencode位置放在缓存文件读取时再做压缩,发现浏览器能正常解码。推断,问题可能是处在数据保存为文件时做gzencode压缩而产生的。
用Sublime打开静态文件,发现其中的编码位置显示的是“hexadecimal”(16进制),然后尝试用UTF8编码后再打开页面,报解码错误。
而现在的数据是需求更改后的数据,体积很小,本身未压缩的情况下就只有100K左右。会不会跟数据长度也有关系。于是回到早期未改需求时的分支进行测试。测试后发现,只要不更改静态文件的编码,就可以正常显示。
开始时之所以会报解码错误,是因为我几次都是还没在浏览器上输出之前就打开过静态文件看,并把编码方式修改了。
所以用GZIP生成的文件,务必编码为16进制(hexadecimal),不要修改成其他的编码格式。
时间: 2024-10-28 21:11:32