我正在从Web服务器下载存储在Webroot之外的文件。 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上一直有效,直到此最新更新为止。
有人获得任何潜在的服务器端解决方案,以确保传输正确的文件大小数据吗?
我猜这是因为您正在通过使用模式r
而不是模式rb
打开文件来检查文件大小。将其更改为后者。 (此外,如果您没有充分的理由不使用filesize
,则只需这样做,而不要自己编写。)
哇,这很尴尬:/
经过数小时的尝试之后,我想到的一切都证明我需要做的就是在脚本结尾处退出脚本。奇怪的是,其他浏览器都没有这个问题,但是Firefox显然更挑剔。
filesize