我一直在开发一个 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 文件中是否有任何设置可能会阻止这种情况?任何人都可以提供有关如何进一步解决或排除此问题的任何其他建议吗?
Thanks!
2011 年 5 月 18 日更新
感谢 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 已关闭。
我们肯定走在正确的轨道上。这里有什么关于为什么要压缩它的建议吗?以及如何预防呢?
Thanks!
最终更新:已解决
我在托管提供商的网站上找到了一个论坛,其中有人解释说 gzip 最近已打开,并详细说明了如何停止它。http://www.bluehostforum.com/showthread.php?18996-Turning-off-Gzip http://www.bluehostforum.com/showthread.php?18996-Turning-off-Gzip
基本上,我将以下内容添加到我的 .htaccess 文件中,这会关闭 gzip 压缩。然后,我得到 Content-Length 标头和进度条。
SetEnv no-gzip dont-vary
非常感谢!