更新到 71.0 OSX 后,Firefox 下载随机失败

Posted

技术标签:

【中文标题】更新到 71.0 OSX 后,Firefox 下载随机失败【英文标题】:Firefox downloads fail randomly after update to 71.0 OSX 【发布时间】:2019-12-15 02:55:25 【问题描述】:

我正在从我的网络服务器下载存储在网络根目录之外的文件。 php 正在处理文件传输。在其他所有浏览器上一切正常,并且在最新的浏览器更新之前一直在 Firefox 上运行。

现在文件有时会完成,有时会失败并显示消息:

xxxxx.part could not be saved, because the source file could not be read.

这是完全随机的,同一个文件会失败 3 或 4 次然后下载没有问题,也可能第一次尝试下载文件没有问题。这完全没有意义。

我已经尝试了HERE 列出的所有内容,但没有任何解决方法。

我了解到,服务器最初报告的文件大小小于实际文件是一个问题。显然 Firefox 过去对此没问题,但现在将此类文件标记为已损坏。它可以在 FF 首选项中禁用,但这一点都不理想,因为此脚本在提供 mp3、wav 和 zip 文件的下载商店上运行。

这是我如何使用 PHP 提供文件的主要内容:

if (file_exists($filepath)) 

  if (ini_get('zlib.output_compression')) 
      ini_set('zlib.output_compression', 'Off');
  

  set_time_limit(0);
  $fp = @fopen($filepath, 'rb');

  if ($fp) 

      if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
          header('Content-Description: File Transfer');
          header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename="'. $filename .'"');
          header('Expires: 0');
          header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
          header("Content-Transfer-Encoding: binary");
          header('Pragma: public');
          header("Content-Length: ". self::get_file_size($filepath));
       else 
          header('Content-Description: File Transfer');
          header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename="'. $filename .'"');
          header("Content-Transfer-Encoding: binary");
          header('Expires: 0');
          header('Pragma: no-cache');
          header("Content-Length: ". self::get_file_size($filepath));
      

      fpassthru($fp);
      fclose($fp);

      ob_flush();
      flush();
  

这是计算文件大小的函数(它位于同一个类中):

public static function get_file_size ($file) 

    $fp = @fopen($file, "r");
    @fseek($fp,0,SEEK_END);
    $filesize = @ftell($fp);
    fclose($fp);
    return $filesize;

正如我所说,这可以在所有其他浏览器上完美运行,并且在最新更新之前一直在 FF 上运行。

有人有任何潜在的服务器端解决方案来确保传输准确的文件大小数据吗?

【问题讨论】:

【参考方案1】:

我猜这是因为您通过使用模式r 而不是模式rb 打开文件来检查文件大小。将其更改为后者。 (另外,如果你没有充分的理由不使用filesize,那么就这样做而不是自己编写。)

【讨论】:

不,没有解决任何问题。尝试更改为“rb”并将其移至与我意识到我两次打开和关闭文件浪费资源的功能相同的功能(有趣的是,当您将其作为问题发布时,您如何能更清楚地看到事情)。还尝试完全慢跑,只需使用filesize($filepath),但仍然遇到同样的问题。 啊,您的解决方案确实有效,但不是我尝试使用它的方式。我在变量$filesize = filesize($filepath); 中声明文件大小,然后在标题header("Content-Length: ". $filesize); 中使用它 - 这不起作用......但是当我将它切换到header("Content-Length: ". filesize($filepath)); 时,它现在似乎工作正常。非常感谢兄弟,你让我头疼不已! 不废话.. 还在发生 :( 一定是 firefox 错误,那不是好时机... 这几乎肯定不是 Firefox 错误。 进一步阅读,它可能是 nginx 压缩文件,导致文件更小。现在只是想找出如何禁用非 webroot 目录的压缩。【参考方案2】:

哇,这太尴尬了:/

经过数小时的尝试,我能想到的一切都证明了我需要做的就是在脚本结束时退出脚本。奇怪的是,其他浏览器都没有这个问题,但 Firefox 显然更挑剔一些。

exit;

【讨论】:

您的文件末尾是否有 ?> 没有显示给我们? 这是从一个类传递到另一个类的一大堆函数的一小部分,所以是的,很有可能。 这才是真正的原因。您不需要在 PHP 脚本末尾添加 ?>,如果您有,那么它之后的任何内容(包括尾随换行符)都将在输出中结束。

以上是关于更新到 71.0 OSX 后,Firefox 下载随机失败的主要内容,如果未能解决你的问题,请参考以下文章

centos7下更新firefox

将 osx 更新到 macOS Sierra 后 MAMP PRO 4+ 消失主机 /etc/hosts

mac osx从10.13.6更新到10.14时提示“安装需要下载重要内容。该内容此时无法下载。请稍后再试。”

mac osx从10.13.6更新到10.14时提示“安装需要下载重要内容。该内容此时无法下载。请稍后再试。”

Linux-CentOS 更新Firefox版本

更新后 NPM 死机 - 找不到模块 (OSX)