天天看點

php實作檔案下載下傳的代碼的簡單總結

php實作檔案下載下傳的原理需要用到header函數來發送相關資訊給用戶端浏覽器,同時再結合filesize函數來讀取檔案大小并進行下載下傳操作,本文分享了幾個例子。

1.簡單檔案下載下傳

簡單的檔案下載下傳隻需要使用HTML的連接配接标記,并将屬性href的URL值指定為下載下傳的檔案即可。所示:

<a href=”http://www.ecjson.com/download/book.rar”>下載下傳檔案</a>

如果通過上面的代碼實作檔案下載下傳,隻能處理一些浏覽器不能預設識别的MIME類型檔案,例如當通路book.rar檔案時,浏覽器并沒有直接打開,而是彈出一個下載下傳提示框,提示使用者“下載下傳”還是“打開”等處理方式。但如果需要下載下傳字尾名為.html的網頁檔案、圖檔檔案及PHP程式腳本檔案等,使用這種連接配接形式,則會将檔案内容直接輸出到浏覽器中,并不會提示使用者下載下傳。

2.帶header函數的下載下傳

為了提高檔案的安全性,不希望在<a>标簽中給出檔案的連結,則必須向浏覽器發送必要的頭資訊,以通知浏覽器将要進行下載下傳檔案的處理。PHP使用header()函數發送網頁的頭部資訊給浏覽器,該函數接收一個頭資訊的字元串作為參數。檔案下載下傳需要發送的頭資訊包括以下三部分,通過調用三次header()函數完成。以下載下傳圖檔test.gif為例,需要發送的頭資訊的所示:

header(‘Content-Type:imge/gif'); //發送指定檔案MIME類型的頭資訊
header(‘Content-Disposition:attachment; filename=”test.gif”‘); //發送描述檔案的頭資訊,附件和檔案名
header(‘Content-Length:3390′); //發送指定檔案大小的資訊,機關位元組      

如果使用header()函數向浏覽器發送了這三行頭資訊,圖檔test.gif就不會直接在浏覽器中顯示,而讓浏覽器将該檔案形成下載下傳的形式。在函數header()中,“Content-Type”指定了檔案的MIME類型,“Content_Disposition”用于檔案的描述,值“attachment; filename=”test.gif””說明這是一個附件,并且指定了下載下傳後的檔案名,“Content_Length”則給出了被下載下傳檔案的大小。

設定完頭部資訊以後,需要将檔案的内容輸出到浏覽器,以便進行下載下傳。可以使用PHP中的檔案系統函數将檔案内容讀取出來後,直接輸出給浏覽器。最友善的是使用readfile()函數,将檔案内容讀取出來直接輸出。下載下傳檔案test.gif的所示,Content-Type參考http://www.ecjson.com/contenttype/

<?php
$filename = "test.gif";
header('Content-Type:image/gif'); //指定下載下傳檔案類型
header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下載下傳檔案的描述
header('Content-Length:'.filesize($filename)); //指定下載下傳檔案的大小
  
//将檔案内容讀取出來并直接輸出,以便下載下傳
readfile($filename);
?>      

上面如果碰到中文名字就會無法正常下載下傳了,對于中文名字下載下傳檔案的執行個體代碼

<?php 
header("Content-type:text/html;charset=utf-8");  
$file_name="ceshi.jpg"; 
//用以解決中文不能顯示出來的問題 
$file_name=iconv("utf-8","gb2312",$file_name); 
$file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/"; 
$file_path=$file_sub_path.$file_name; 
//首先要判斷給定的檔案存在與否 
if(!file_exists($file_path)){ 
    echo "沒有該檔案檔案"; 
    return ; 
} 
$fp=fopen($file_path,"r"); 
$file_size=filesize($file_path); 
//下載下傳檔案需要用到的頭 
Header("Content-type: application/octet-stream"); 
Header("Accept-Ranges: bytes"); 
Header("Accept-Length:".$file_size); 
Header("Content-Disposition: attachment; filename=".$file_name); 
$buffer=1024; 
$file_count=0; 
//向浏覽器傳回資料 
while(!feof($fp) && $file_count<$file_size){ 
$file_con=fread($fp,$buffer); 
$file_count+=$buffer; 
echo $file_con; 
} 
fclose($fp); 
?>      

header("Content-type:text/html;charset=utf-8")的作用:在伺服器響應浏覽器的請求時,告訴浏覽器以編碼格式為UTF-8的編碼顯示該内容

關于file_exists()函數不支援中文路徑的問題:因為php函數比較早,不支援中文,是以如果被下載下傳的檔案名是中文的話,需要對其進行字元編碼轉換,否則file_exists()函數不能識别,可以使用iconv()函數進行編碼轉換

Header("Content-type: application/octet-stream")的作用:通過這句代碼用戶端浏覽器就能知道服務端傳回的檔案形式 
Header("Accept-Ranges: bytes")的作用:告訴用戶端浏覽器傳回的檔案大小是按照位元組進行計算的 
Header("Accept-Length:".$file_size)的作用:告訴浏覽器傳回的檔案大小 
Header("Content-Disposition: attachment; filename=".$file_name)的作用:告訴浏覽器傳回的檔案的名稱