我在实现Flex 3.0.0客户端时遇到了麻烦,该客户端通过套接字HTTP库(不是class HTTPService
)从服务器接收压缩的HTTP正文。
首先,似乎nginx仅使用gzip
支持gzip on;
压缩。 (如果我错了,请纠正我。)因此,请将Accept-Encoding: gzip
的HTTP标头添加到请求中。
然后我从带有标题ByteArray
的HTTP响应中获得压缩的Content-Encoding: gzip
。
这里的问题是正确地解压缩压缩数据,即HTTP主体。
在Flex的更高版本中,ByteArray中有一个函数deflate。但它在Flex 3.0.0中不存在。升级到更高版本不是一个选项,因为它会使现有的应用程序不稳定,带来一些新的看不见的错误。
是否有替代方法,代码或库来解压缩gzip
中的ByteArray
数据?
答案 0 :(得分:1)
所需的ByteArray方法与特定版本的Flex无关。 (ByteArray类不是Flex类 - 它是Flash Player和AIR中内置类的一部分。)因此,即使您的应用程序使用Flex 3,如果您可以定位Flash Player 10+或AIR 1+,那么您应该能够使用该库。
如果这绝对不可能,那么还有另一种可能性,但这需要一些工作。
创建此ActionScript库是为了使用.zip文件: http://nochump.com/blog/archives/15
但是,它不使用内置的ByteArray压缩,而是包含flate算法的ActionScript实现。所以你可以(理论上)使用该库中的Inflater类来代替Chubbard提到的GZip库中对ByteArray.uncompress()的调用
答案 1 :(得分:1)
来自chubbard和probertson的回答。我已经找到了解决方案。
http://probertson.com/projects/gzipencoder/
http://nochump.com/blog/archives/15
将GzipEncoder和Zip Library添加到src
在GzipBytesEncoder.as
GzipEncoder
(com.probertson.utils
)的srcBytes.deflate();
中,
替换
var outBuffer:ByteArray = new ByteArray;
var deflater:Deflater = new Deflater();
deflater.setInput(srcBytes);
deflater.deflate(outBuffer)
srcBytes = outBuffer;
与
data.inflate();
并替换
var outBuffer:ByteArray = new ByteArray;
var inflater:Inflater = new Inflater();
inflater.setInput(data);
inflater.inflate(outBuffer)
data = outBuffer;
与
{{1}}
答案 2 :(得分:0)