php文件浏览器,可以浏览但不能下载Chrome中的文件.在IE中确定(Windows - php代码)


php file browser, can browse but can't download files in Chrome...ok in IE (Windows - php code)

下面是一些从用PHP编写的文件浏览器中提取的代码。

实际上,文件浏览可以正常工作,其余的也是如此,但是,在最近的Google Chrome更新之后,下载不仅在该浏览器上有效(无论如何,我还没有测试过Firefox)。我在其他地方搜索过,但没有找到任何帮助。有趣的是,下载在IE中运行良好,并且在Chrome上的最新更新之前工作。

也许我应该知道一些相关的标准变化?

在代码的相关部分下方。

global $_ERROR;
    global $_START_TIME;
    // If user click the download link
    if(isset($_GET['filename']))
    {
        // The directory of downloadable files
        // This directory should be unaccessible from web
        $file_dir="C:/Directory/".$this->location->getDir(false, true, false, 0);
        // Replace the slash and backslash character with empty string
        // The slash and backslash character can be dangerous
        $file_name=str_replace("/", "", $_GET['filename']);
        $file_name=str_replace("''", "", $file_name);
        // If the requested file exists
        if(file_exists($file_dir.$file_name))
        {
            // Get the file size
            $file_size=filesize($file_dir.$file_name);
            // Open the file
            $fh=fopen($file_dir.$file_name, "r");
            // Download speed in KB/s
            $speed=2048;
            // Initialize the range of bytes to be transferred
            $start=0;
            $end=$file_size-1;
            // Check HTTP_RANGE variable
            if(isset($_SERVER['HTTP_RANGE']) && preg_match('/^bytes=('d+)-('d*)/', $_SERVER['HTTP_RANGE'], $arr))
            {
                // Starting byte
                $start=$arr[1];
                if($arr[2])
                {
                    // Ending byte
                    $end=$arr[2];
                }
            }   
            // Check if starting and ending byte is valid
            if($start>$end || $start>=$file_size)
            {
                header("HTTP/1.1 416 Requested Range Not Satisfiable");
                header("Content-Length: 0");
            }
            else
            {
                // For the first time download
                if($start==0 && $end==$file_size)
                {
                    // Send HTTP OK header
                    header("HTTP/1.1 200 OK");
                }
                else
                {
                    // For resume download
                    // Send Partial Content header
                    header("HTTP/1.1 206 Partial Content");
                    // Send Content-Range header
                    header("Content-Range: bytes ".$start."-".$end."/".$file_size);
                }
                // Bytes left
                $left=$end-$start+1;    
                // Send the other headers
                header("Content-Type: application/octet-stream ");
                header("Accept-Ranges: bytes");
                // Content length should be the bytes left
                header("Content-Length: ".$left);
                header("Content-Disposition: attachment; filename=".$file_name);
                // Read file from the given starting bytes
                fseek($fh, $start);
                // Loop while there are bytes left
                while($left>0)
                {
                    // Bytes to be transferred
                    // according to the defined speed
                    $bytes=$speed*1024;
                    // Read file per size
                    echo fread($fh, $bytes);
                    // Flush the content to client
                    flush();
                    // Substract bytes left with the tranferred bytes
                    $left-=$bytes;
                    // Delay for 1 second
                    sleep(1);
                }
            }
            fclose($fh);
        }
        else
        {
            // If the requested file is not exist
            // Display error message
            $_ERROR = "File not found!";
        }
    }

代码的这一相关部分将修复我自己的答案,这是微不足道的,一个简单的错误直到最近更新一个浏览器才被注意到:

修改

 // For the first time download
            if($start==0 && $end==$file_size)
            {
                // Send HTTP OK header
                header("HTTP/1.1 200 OK");
            }

 // For the first time download
            if($start==0 && ($end+1)==$file_size)
            {
                // Send HTTP OK header
                header("HTTP/1.1 200 OK");
            }