php - 无法显示从新服务器下载文件的进度(在以前的服务器上工作)

标签 php iphone web-services apache

我一直在开发一个 iPad 应用程序,它使用 ASIHTTPRequest 下载一些 PDF 文件。我一直在使用进度委托(delegate)为用户显示一个进度条,显示文件的下载进度。这是 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 中打开这两个文件来确定这一点。

  • 打开“good server”的 URL,状态栏显示“completed 1.4 of 20.3 MB”。
  • 打开“错误服务器”的 URL,状态栏显示“已完成 1.4 MB 的 ?”。

我已经检查过,我的 remote_filesize() 函数在两台服务器上都返回了 21331445(大约 20 MB)。

因此,此时我的结论是,出于某种原因,“错误的服务器”没有正确设置 Content-Length header ,即使我已经指定了它。 php.ini 文件中是否有任何设置可能会阻止这种情况发生?任何人都可以就如何进一步解决或解决此问题提供任何其他建议吗?

谢谢!

2011 年 5 月 18 日更新

感谢 AJ 在 Firefox 中检查 header 的出色建议,我发现“坏服务器”正在使用 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 已关闭。

我们当然走在正确的轨道上。关于为什么要压缩它的任何建议?又该如何预防?

谢谢!

最终更新:已解决

我在托管服务提供商的网站上找到了一个论坛,其中有人解释说 gzip 最近已被打开,并详细说明了如何停止它。 http://www.bluehostforum.com/showthread.php?18996-Turning-off-Gzip

基本上,我将以下内容添加到我的 .htaccess 文件中,这将关闭 gzip 压缩。然后,我得到 Content-Length header 和我的进度条。

SetEnv no-gzip dont-vary

非常感谢!

最佳答案

只需将结果作为答案发布,这样我就可以将问题标记为已回答。感谢所有有用的评论!

我在托管服务提供商的网站上找到了一个论坛,其中有人解释说 gzip 最近已被打开,并详细说明了如何停止它。 http://www.bluehostforum.com/showthread.php?18996-Turning-off-Gzip

基本上,我将以下内容添加到我的 .htaccess 文件中,这将关闭 gzip 压缩。然后,我得到 Content-Length header 和我的进度条。

SetEnv no-gzip dont-vary

关于php - 无法显示从新服务器下载文件的进度(在以前的服务器上工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052208/

相关文章:

php - 来自 Kohana ORM 的订单结果

php 无法使用 empty() 返回 FATAL ERROR 检查 PDO 结果是否为空

c# - System.Web.Services.Protocols.SoapException : Server was unable to process request. ---> System.ArgumentNullException

php - 正则表达式:删除方案,除非它是 http(s)。 (捕获负后视模式)

javascript - 如何在 angularjs 中使用服务或工厂

iphone - NSFetchedResultsController 在 performFetch : when using a cache 上崩溃

iphone - 修改 usr/bin 后可执行文件中的 CPU 类型错误

android - 如何在 Android 和 iPhone 的移动应用程序中实现推荐计划

java - 需要在没有 wsdl 的情况下调用 soap ws

java - 用于 RESTful Web 服务的 Spring Boot 与 Apache CXF?