本文章給大家來總結幾種實現下載短點續傳程序功能,這些函數中主要是用到了php的header函數,有需要了解的朋友可進入參考。
例如:下載時輸出 下載文件大小,文件名等等
前提是.htaccess文件的配置需要添加一句
SetEnv no-gzip dont-vary
就是針對文件不進行壓縮處理
例1
代碼如下 復制代碼<?php
function download($file_dir,$file_name)
//參數說明:
//file_dir:文件所在目錄
//file_name:文件名
{
$file_dir = chop($file_dir);//去掉路徑中多余的空格
//得出要下載的文件的路徑
if($file_dir != '')
{
$file_path = $file_dir;
if(substr($file_dir,strlen($file_dir)-1,strlen($file_dir)) != '/')
$file_path .= '/';
$file_path .= $file_name;
} else {
$file_path = $file_name;
}
//判斷要下載的文件是否存在
if(!file_exists($file_path))
{
echo '對不起,你要下載的文件不存在。';
return false;
}
$file_size = filesize($file_path);
@header("Cache-control: public");
@header("Pragma: public");
//header("Content-Encoding: gzip");
@header("Content-Type: application/octetstream");
header("Content-Length: $file_size");
Header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=".$file_name);
$fp = fopen($file_path,"r");
fpassthru($fp);
return true;
}
download('路徑參數','文件名');
?>
例2
代碼如下 復制代碼 $fname = './MMLDZG.mp3';
fpassthru() 函數輸出文件指針處的所有剩余數據。
該函數將給定的文件指針從當前的位置讀取到 EOF,並把結果寫到輸出緩沖區
上面兩個實例對中文支持不好,下面這個函數很好的解決了這個問題
代碼如下 復制代碼<?php
/**
* PHP-HTTP斷點續傳實現
* @param string $path: 文件所在路徑
* @param string $file: 文件名
* @return void
*/
function download($path,$file) {
$real = $path.'/'.$file;
if(!file_exists($real)) {
return false;
}
$size = filesize($real);
$size2 = $size-1;
$range = 0;
if(isset($_SERVER['HTTP_RANGE'])) {
header('HTTP /1.1 206 Partial Content');
$range = str_replace('=','-',$_SERVER['HTTP_RANGE']);
$range = explode('-',$range);
$range = trim($range[1]);
header('Content-Length:'.$size);
header('Content-Range: bytes '.$range.'-'.$size2.'/'.$size);
} else {
header('Content-Length:'.$size);
header('Content-Range: bytes 0-'.$size2.'/'.$size);
}
header('Accenpt-Ranges: bytes');
header('application/octet-stream');
header("Cache-control: public");
header("Pragma: public");
//解決在IE中下載時中文亂碼問題
$ua = $_SERVER['HTTP_USER_AGENT'];
if(preg_match('/MSIE/',$ua)) {
$ie_filename = str_replace('+','%20',urlencode($file));
header('Content-Dispositon:attachment; filename='.$ie_filename);
} else {
header('Content-Dispositon:attachment; filename='.$file);
}
$fp = fopen($real,'rb+');
fseek($fp,$range);
while(!feof($fp)) {
set_time_limit(0);
print(fread($fp,1024));
flush();
ob_flush();
}
fclose($fp);
}
/*End of PHP*/