我一直在开发iPad应用程序,该应用程序使用ASIHTTPRequest下载一些PDF文件.我一直在使用进度委托来为用户显示进度条,以显示文件的下载进度.这是ASIHTTPRequest设置代码.
request = [ASIHTTPRequest requestWithURL:url];
[request setShouldContinueWhenAppEntersBackground:YES];
[request setDownloadDestinationPath:issue.pdfFilepath];
[request setDownloadProgressDelegate:vc.progressView];
request.showAccurateProgress = YES;
[request setDelegate:self];
[request startAsynchronous];
从我的开发服务器(“好的服务器”)读取数据,所有这些工作都非常出色.但是,是时候将该应用程序的服务器端移到我的客户端的服务器(“不良服务器”)上了.我将所有内容移了过去,仍然能够成功下载PDF,但是在完成下载之前(而不是整个下载过程中)进度条不会更新.
这是我一直用于输出PDF的PHP:(请注意,我也在基于请求的URL在数据库中增加视图计数等,因此我不能直接从应用程序直接访问PDF.我需要从PHP脚本输出PDF.)
header('Content-type: application/pdf');
header('Content-Disposition:inline filename="downloaded.pdf"');
header('Content-Length: '.remote_filesize($pdfUrl) );
readfile($pdfUrl);
我已经能够确定该应用程序没有更新进度条,因为该应用程序最初不知道PDF的总大小.我已经通过在Safari中打开两个文件确定了这一点.
>打开“好服务器”的URL,状态栏显示“已完成1.4的20.3 MB”.
>打开“故障服务器”的URL,状态栏显示“已完成1.4 MB?”.
我已经检查过了,我的remote_filesize()函数在两台服务器上都返回21331445(约20 MB).
因此,我的结论是由于某种原因,即使我指定了“坏服务器”,它也无法正确设置Content-Length标头. php.ini文件中是否有任何设置可能会阻止这种情况?谁能提供任何其他建议进一步解决或解决此问题?
谢谢!
更新5/18/11
感谢AJ关于检查Firefox中标头的出色建议,我发现“不良服务器”正在使用gzip压缩,而不是设置我的Conent-Length.比较如下:
好的服务器
Server: Apache
X-Powered-By: PHP/5.3.3
Content-Disposition: inline filename="downloaded.pdf"
Content-Length: 21331445
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/pdf
200 OK
坏服务器
Server: Apache
X-Powered-By: PHP/5.2.17
Content-Disposition: inline filename="downloaded.pdf"
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=10, max=30
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/pdf
200 OK
我发现一些文章建议通过确保php.ini文件中的“ output_buffering = Off”和“ zlib.output_compression = Off”来关闭gzip.不过是这种情况,两个服务器上的phpinfo()都显示output_buffering和output_compression已关闭.
我们当然在正确的轨道上.这里有什么建议为什么要被压缩?以及如何预防呢?
谢谢!
最终更新:已解决
基本上,我将以下内容添加到了.htaccess文件中,该文件关闭了gzip压缩功能.然后,我得到Content-Length标头和进度条.
SetEnv no-gzip dont-vary
非常感谢!