当前位置:
首页 > Win环境 > 问题解决 > iis开启gzip后对页面的影响与浏览问题探讨

iis开启gzip后对页面的影响与浏览问题探讨

我现这里想说的是flash文件在打开gzip服务的服务器下的那些问题。gzip服务是挺好的,可以压缩传输文件,更快的下载速度。但使用gzip也会存在问题,首先文件需要压缩与解压,无形中增大了服务器与客户端的负担,其次,swf文件在加载数据时,会存在一些暂时无法解决的问题。这只能期待adobe在下一版本中解决….
如果你的Swf上传到服务器后发现loading加载百分数有问题,比如不管如何加载总是表示0%或总是显示99%,加载一会后,突然显示加载完成,而在本地模拟下载测试则没这问题,那你先测试你所用的web服务器是不是有gzip服务?

对于一个打开gzip服务的web服务,swf文件加载有何影响?现只是在IE8及FF(Firefox 3.6.6)下做测试,window 7+flashplayer 10.53.64并得出不同的结果…

IE8 Firefox
AS2加载 swf 加载swf文件,可获得swf的总字节数(bytesTotal)及当前加载字节灵长(bytesLoaded),但总字节数(bytesTotal)与 实际的swf文件大,因为这个总字节数(bytesTotal)是得到非压缩的swf文件的大小,(在flash IDE中按Shift+Ctrl+F12打开发布设置,在swf页下有一叫Compress Movie的勾选框,默认为勾上的,如果去掉此勾,则发布出来的Swf为非压缩。)虽然swf的总字节数(bytesTotal)比实际swf文件大,但这并不影响加载的判断,至少在progress事件计算出来的百分数是正确的。 与IE8得到的结果一样
AS3 加载swf 不管是加载swf还是检测自身加载,都得不到swf的总字节数(bytesTotal),只能得到当前加载字节数(bytesLoaded),swf的总 字节数(bytesTotal)值总为0,如果再次刷新页面,swf会读取缓存中的数据,没有通过gzip压缩,有可能会得到swf的总字节数 (bytesTotal)。

结果是,得到的Loading 百分数会一直显示在0%或Infinite,因为bytesTotal值为0。
能得到加载的swf总字节数(bytesTotal)与当前加载字节数(bytesLoaded),但总字节数(bytesTotal)数值随着当前加载字节数(bytesLoaded)而变化,也就是说不是一个定值,bytesTotal比bytesLoaded数值大一点,一直到文件快加载完成时,才显示真正的swf文件大小。

结果是,得到的Loading 百分数会一直显示在99%,然后就突然显示加载完成

jpg,png 与加载swf一样,得到bytesTotal数值总为0。不管是AS2或AS3方法去加载jpg或png,得到的结果都是一样的。 AS2:bytesTotal与bytesLoaded大小一样,随着bytesLoaded变化而变化。(bytesTotal=bytesLoaded)
AS3:与加载swf一样,得到的bytesTotal数值比bytesLoaded大一点。(bytesTotal>bytesLoaded)

flv AS2:始终显示为bytesTotal为-1,bytesLoaded是正确的。
AS3:加载flv,得到的bytesTotal为很大的数,比实际的大很多很多。bytesLoaded倒为正确的数值,如果用bytesLoaded/bytesTotal得到加载的百分数,则数值肯定不正确的。 AS2:bytesTotal与bytesLoaded的值一样。
AS3:加载flv,一开始读到一个非常大的数,也就是当下载字节数(bytesLoaded)为0时,总字节数(bytesTotal)非常大,这个值与IE中得到的数值是一样的。当下载字节数(bytesLoaded)大于0时,总字节数也就变了,变成与下载字节数(bytesLoaded)一样。
mp3 AS2:getBytesLoaded()返回0,getBytesTotal()返回undefined
AS3:bytesLoaded返回正常下载值,bytesTotal返回0 AS2:getBytesLoaded()返回值与getBytesTotal()返回一样,随着下载数变而变化。
AS3:bytesLoaded与bytesTotal值相等,随着下载数而变化。
结论:
swf加载这问题,在firefox下的问题比IE好些,但与没打开gzip服务相比,问题还是蛮多的。用AS2编程比用AS3编程好,但问题还是有的。具体问题可以参照上表。我个人认为,因为打开了gzip服务,原来在http head有一Content-lenth的属性,现没有了,所以除了swf文件以外的文件,都得不到真实文件大小,所以只能下载多少,总字节数(bytesTotal)显示多少。而对于swf文件,用AS2与AS3加载同样的文件却得到不同的结果,这问题我实在没看明白。对AS2可以得到总字节数(bytesTotal),此字节数是非压缩swf的大小,而不是实际swf的大小。我觉得可能是swf读取被加载的swf的头文件得到的swf大小数值。

解决方法:
1.关闭服务器上对swf,flv,jpg,png,mp3等文件的gzip压缩,这是最佳的解决方法。但如果服务器不受你控制,你没办法关闭gzip服务,那只能尝试用以下方法。
2.使用旋转菊花或类似windows XP进入系统无限循环的进程条,这样就不会存在加载的百分数,也不需要bytesLoaded与bytesTotal值,只需要加载的开始与被加载对象加载完成既可,这两个事件都能很好地运作。
3.如果非要使用有百分数的loading,或非循环类的进度条,那就必须使用bytesLoaded/bytesTotal得到加载进程的百分数。但在IE下,拿不到bytesTotal值,怎么办?对于swf,可以通过URLStream类来加载swf,然后通过byteArray类读取swf的文件头来得到swf文件大小,或者用AS2读取swf,然后通过LocalConnection类来把swf文件大小传给AS3文件,通过此方法,会存在两个问题,一个是被加载的swf会被加载两次,虽然只要获得被加载的swf大小就可以中止下载,但还是会有两次HTTP请求。第二个问题是,得到的总字节数是非压缩的swf大小,而不是实际swf大小。(即使通过byteArray.compress()方法得到的swf大小也与实际swf大小不相符。)我们只需要得到大概的bytesTotal值既可,所以当loading的百分数显示到99%,实际上也就加载完成,可直接显示swf内容,而不一定非要显示100%。
4.对加载非Swf文件,那就没办法通过上方法得到总字数,只能通过自定义把要加载的媒体文件大小写到fla文件里,只需写个大概的大小既可,不用详细到与实际文件大小一样,因为如果被加载的媒体文件有变化,那更新起来是相当的麻烦。然后在程序里写这样的判断bytesLoaded/customBytesTotal>=1,则把percent的值强制转为0.99,这样就不会因为加载数超过100%而产生奇怪的问题了。当onComplete事件调用时,既可把loading隐藏起来,显示被加载的媒体文件

结论:主要对swf影响比较大,建议gzip里不要开启swf,jpg,gif,png压缩,本身图片就是压缩过的,而且gzip也不会对图片压缩起到明显的效果。swf会出现莫名其妙的问题