下面是从用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!";
}
}
答案 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");
}