標籤:pat 解決 注意 情況 ring 目錄 .class flush 字母
<?phpinclude("DBDA.class.php");$db = new DBDA();$bs = $_SERVER["QUERY_STRING"]; //直接擷取由提交介面傳過來的參數,注意要用<a>標籤、<form>表單或者window.location.href="chuli.php?id="+id+""傳值,而不能用ajsx傳值。$bss = substr($bs,3); //截取 = 後面的值,依據傳過來的值進行截取,視具體情況而定。$sql = "select video from shangpin where id=‘{$bss}‘"; //擷取視頻檔案路徑,視具體情況寫sql語句。$str = $db->StrQuery($sql);$wjm = substr($str,13); //截取檔案名稱,按照實際情況截取。$lj = substr($str,0,13); //截取檔案所在檔案夾路徑,按照實際情況截取。$file_name = $wjm; //檔案名稱//用以解決中文不能顯示出來的問題 $file_name=iconv("utf-8","gb2312",$file_name); $file_sub_path=$_SERVER[‘DOCUMENT_ROOT‘].$lj; //擷取當前運行指令碼所在的主目錄$file_path=$file_sub_path.$file_name; //拼成一個完整的檔案所在的路徑// $file = include path
//var_dump(file_exists($file_path))//可以先判斷檔案是否存在,注意檔案路徑中不能存在漢字,所有的字元都要是英文或字母的。下面的代碼無須更改。
if(file_exists($file_path)) //判斷檔案是否存在{ header(‘Content-Description: File Transfer‘); //header函數是提交給表頭的是一些下載的規格 header(‘Content-Type: application/octet-stream‘); header(‘Content-Disposition: attachment; filename=‘.basename($file_path)); header(‘Content-Transfer-Encoding: binary‘); header(‘Expires: 0‘); header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0‘); header(‘Pragma: public‘); header(‘Content-Length: ‘ . filesize($file_path)); ob_clean(); //ob_clean這個函數的作用就是用來丟棄輸出緩衝區中的內容,如果你的網站有許多產生的檔案,那麼想要訪問正確,就要經常清除緩衝區 flush(); //ob_flush()和flush()的區別。前者是把資料從PHP的緩衝中釋放出來,後者是把不在緩衝中的或者說是被釋放出來的資料發送到瀏覽器。所以當緩衝存在的時候,我們必須ob_flush()和flush()同時使用。 $file = fopen($file_path, "r"); //開啟指定的檔案,r 代表唯讀,如果找不到,返回false while(!feof($file)) //判斷是否存在 { // send the current file part to the browser print fread($file, round(3000 * 1024)); //先頂下載速度為3MB // flush the content to the browser flush(); //傳給瀏覽器 // sleep one second sleep(1); //等待1秒 } fclose($file); //關閉檔案 /*readfile($file_path); //也可以用這種方法,發送完表頭直接輸出,不過沒有限速 exit;*/}
注意的幾點:
1.傳過來的值根據實際情況截取;
2.檔案名稱和檔案路徑也根據實際情況截取;
3.檔案路徑中不能存在漢字,存在漢字的話判斷檔案是否存在會一直返回flase;
4.if裡面的代碼不需要修改;
5.$bs = $_SERVER["QUERY_STRING"];可以直接接受傳過來的值;
PHP做檔案限速下載