iOS与服务器端 GZip压缩问题

昨天搞了一天的GZip压缩,试了三种方式(libz库,ZipArchive,ASIHttpRequest),一开始都不成功。
理论上三个应该都能用的,但我都不行。等我试到第三种方式的时候才知道,不是我的问题,而是后台的问题(Java端输出方式一会再说)。
今天就总结一下,写写iOS与Java服务器获取压缩数据的方法吧。
一、客户端-服务端数据压缩解压流程(ASIHttpRequest)客户端生成request,
设置header允许使用压缩("Accept-Encoding","gzip"),即是告诉服务器,
客户端支持压缩,但凡可以压缩的服务器,尽管来吧!服务器收到这个header,
如果它支持压缩,可以通过压缩方式输出数据,
然后再写入response的header("Content-Encoding","gzip")
1.以ASIHttpRequest为例,代码如下:

NSURL* requestURL = [NSURL URLWithString:_listURL];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:requestURL];

// 默认为YES, 你可以设定它为NO来禁用gzip压缩 [request setAllowCompressedResponse:YES];

  [request setDelegate:self];
  [request startAsynchronous];

  

如果是普通的URLRequest,只要: request.setHeader("Accept-Encoding","gzip");

2.服务器端返回: response.setHeader("Content-Encoding","gzip");

3.客户端响应,同样以ASIHttpRequest为例(此例传输的是json数据,我还使用了SBJson解析一下):

  - (void)requestFinished:(ASIHTTPRequest *)request{
        NSString *jsonString = @"";
        SBJsonParser* jsonParser = [[SBJsonParser alloc] init];
        NSMutableDictionary *jsonDictionary = nil;
        BOOL dataWasCompressed = [request isResponseCompressed]; // 响应是否被gzip压缩过?
        if (dataWasCompressed)
            {
                NSData *uncompressedData = [request responseData];
                // 解压缩后的数据
                NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
                jsonString = [[NSString alloc]initWithData:uncompressedData encoding:enc];
                jsonDictionary = [jsonParser objectWithString:jsonString error:nil];
                [jsonString release];
            }else {
                jsonString = [request responseString];
                jsonDictionary = [jsonParser objectWithString:jsonString error:nil];
            }
                self._tableDict = jsonDictionary;
                [jsonParser release];
                [self loadTableDict];
                [self release];
}

  

附上一篇非常详细的ASIHttpRequest请求Json数据教程(无GZip相关内容):
http://ios-blog.co.uk/articles/tutorials/parsing-json-on-ios-with-asihttprequest-and-sbjson/
libz库 libz库是官方的一个库,貌似ASIHttpRequest也是用这个库解压的,当我们获得压缩过的data数据以后(方法与上面类似,
只是获得了普通的data数据响应),可以使用这种方法解压数据,解压方法如下所示(如果仅仅放在当前类下面使用,传个data参数进来,
然后把self换成变量名):

#include @implementation NSData (DDData)
  - (NSData *)gzipInflate {
      if ([self length] == 0)
         return self;
         unsigned full_length = [self length];
         unsigned half_length = [self length] / 2;
         NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length]; BOOL done = NO;
         int status;
         z_stream strm;
         strm.next_in = (Bytef *)[self bytes];
         strm.avail_in = [self length];
         strm.total_out = 0; 

         strm.zalloc = Z_NULL;
         strm.zfree = Z_NULL;
         if (inflateInit2(&strm, (15+32)) != Z_OK) return nil; 

         while (!done) { // Make sure we have enough room and reset the lengths.
            if (strm.total_out >= [decompressed length])
            [decompressed increaseLengthBy: half_length];

            strm.next_out = [decompressed mutableBytes] + strm.total_out;
            strm.avail_out = [decompressed length] - strm.total_out;
            // Inflate another chunk. status = inflate (&strm, Z_SYNC_FLUSH);
            if (status == Z_STREAM_END)
                done = YES;
                else if (status != Z_OK)
                break;
          }
         if (inflateEnd (&strm) != Z_OK) return nil;
         // Set real length.
         if (done) {
            [decompressed setLength: strm.total_out];
            return [NSData dataWithData: decompressed];
         } else
    return nil;
}

  

附上一篇非常详细的libz库压缩教程 http://www.clintharris.net/2009/how-to-gzip-data-in-memory-using-objective-c/

以及压缩解压教程(代码从这里拷贝的): http://deusty.blogspot.com/2007/07/gzip-compressiondecompression.html

ZipArchive 上面讲的都是Memory压缩与解压,ZipArchive主要是对文档进行处理。昨天在上述方法不成功的情况下,我把获取的data数据
save to file,然后再处理,理论上是可行的,但是由于服务器有误,获取的数据不对,所以我怎么都解压不成功!!!!
示例如下:

Objective-C class used to zip / unzip compressed zip file.
Usage: Add all the files to you project, and and framework libz.1.2.3.dylib. 

include ZipArchive.h
using #import "ZipArchive/ZipArchive.h" *
create zip file 

ZipArchive* zipFile = [[ZipArchive alloc] init];
[zipFile CreateZipFile2:@"zipfilename"]; 

// A OR [[zipFile CreateZipFile2:@"zipfilename" Password:@"your password"];
// if password needed, //empty password will get same result as A 

[zipFile addFileToZip:@"fullpath of the file" newname:@"new name of the file without path"];
//  ....add any number of files here
[zipFile CloseZipFile2];
[zipFile release];

// remember to release the object * unzip compressed file
ZipArchive* zipFile = [[ZipArchive alloc] init];
[zipFile UnzipOpenFile:@"zip file name"]; 

// B (the zip got no password) OR [zipFile UnzipOpenFile:@"zip file name" Password:@"password" ];
[zipFile UnzipFileTo:@"output path" overwrite:YES];
[zipFile UnzipCloseFile];
[zipFile release];

  

时间: 2024-10-10 10:43:09

iOS与服务器端 GZip压缩问题的相关文章

Nginx 开启Gzip压缩的方法(非常的详解)

gzip是GNUzip的缩写了,它的主要作用就是用来减轻服务器的带宽问题了,如一个100KB的文件如果开启gzip之后可以变成20KB左右哦,是不是很有吸引力呀,下面一起来看看吧. 查看ngix编译参考,是否启用了gzip模块,运行命令:  代码如下 复制代码 /path/to/binary/nginx -V (我的nginx在PATH目录里,故命令中可以省略nginx所在的目录),写为nginx -t 即可,下文从略写注意其中是否 --with-http_gzip_static_module,

Linux gzip压缩输出

一.gzip介绍 gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式.软件的作者是Jean-loup Gailly和Mark Adler.1992年10月31日第一次公开发布,版本号是0.1,目前的稳定版本是1.2.4. Gzip主要用于Unix系统的文件压缩.我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的.现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式. 当应用Gzip压缩到一个纯

nginx优化--gzip压缩与expire浏览器缓存

gzip压缩 概述 网页在服务器端经过了gzip或者其他格式的压缩后的输出明显减少了content-length字节,当访问过百万时,这些减少的字节就会变为客观的流量给节约下来;从而减轻服务器的压力以及网页的访问速度; 原理 客户端在向服务端发送http请求时,在请求头中有一个Accept-Encoding的头信息,该头信息告知服务器端本客服端能接收什么样的压缩文件,如果服务器端配置了压缩的需求,就会返回相应的压缩文件,然后浏览器再解码呈现出来;我们在做采集时,需要采集的是未压缩的文件,所以在h

Tomcat配置gzip压缩

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网 页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解 压缩并浏览.相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量.更为重要的是,它可以对动态生成的,包括CGI.PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人 一 对于Tomcat5.0以后的版本是支持对输出内容进行压缩的. 使用的是gzip压缩格式

iOS客户端的gzip解压

服务端使用gzip压缩,可以大幅度减小传输包的体积,加快客户端网络请求速度,为用户节省流量.当服务器返回的httpHeader的"Content-Encoding" 属性的值是gzip时,数据会自动被解压缩,但有时候在客户端还没拿到数据的时候,就已经被某些网关解压了,这样gzip就没有起到作用.因此可以约定其他策略,防止网关解压,例如在别的头属性中标记gzip. 如此,就需要我们自己来解压gzip数据.方法如下:添加framework库中的libbz2.1.0.dylib:给nsdat

thttpd增加gzip压缩响应报文体功能,以减少传输数据量

thttpd thttpd是一个非常小巧的轻量级web server,它非常非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他web server(如Apache, Zeus等)的对比图+Benchmark,可以参考参考.此外,thttpd 也类似于lighttpd,对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现.因此效能很好. thttpd 支持多种平台,如FreeBSD, SunOS, Solaris, BSD

GZIP压缩优化

使用gzip优化web应用(filter实现) 相关知识: gzip是http协议中使用的一种加密算法,客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其他资源,返回到客户端,客户端加载后渲染呈现,这种情况文件一般都比较大,如果开启Gzip ,那么服务器端响应后,会将页面,JS,CSS等文本文件或者其他文件通过高压缩算法将其压缩,然后传输到客户端,由客户端的浏览器负责解压缩与呈现.通常能节省40%以上的流量(一般都有60%左右),一些PHP,JSP文件也能够进行压缩. 实  

设置TOMCAT启用GZIP压缩

原理简介 HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览.相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量.更为重要的是,它可以对动态生成的,包括CGI.PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高. 配置方法 Tomcat5.0以后的版本是支持对输出内容进行压缩的,使用的

Nginx Gzip 压缩配置

Nginx Gzip 压缩配置 随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? gzip(GNU-ZIP)是一种压缩技术.经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多.gzip的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压并解析.浏览器那里不需要我们担心,因为目前的巨大多数浏览器都支持解析gzip过的页面.Ng