简体   繁体   English

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

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

Below there is some code extracted from a file browser written in PHP. 下面是从用PHP编写的文件浏览器中提取的一些代码。

Actually the file browsing works and all the rest too but, after a recent Google Chrome update, downloads wouldn't work only on that browser (I've not tested firefox anyway). 实际上,文件浏览和其他所有功能都可以正常工作,但是,在最近的Google Chrome浏览器更新之后,下载仅不能在该浏览器上进行(无论如何我都没有测试过firefox)。 I've searched elsewhere, but found nothing that could help. 我在其他地方搜索过,但找不到任何可以帮助的地方。 The Interesting thing, is that the download works fine in IE, and worked before the recent update on chrome. 有趣的是,下载在IE中工作正常,并且在chrome的最新更新之前有效。

Maybe there are some relevant changes in standards that I should know of? 我应该知道一些有关标准的变化吗?

Below the relevant portion of code. 在代码的相关部分下方。

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!";
        }
    }

This relevant portion of code will fix my own answer, this was trivial, a simple error never noticed until recent updates of one browser: 这部分相关的代码将解决我自己的答案,这很简单,这是一个简单的错误,直到最近更新一个浏览器时才注意到:

Modify 修改

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

into 进入

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM