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

时间:2016-07-10 12:29:28

标签: php html google-chrome internet-explorer

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

实际上文件浏览工作正常,但是在最近的谷歌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!";
        }
    }

1 个答案:

答案 0 :(得分:0)

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

修改

 // 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");
            }