PHP文件下載的原理及實現
通常文件下載過程是十分簡單的建立一個鏈接指向到目標文件就可以了例如下面的鏈接
<a href=http://wwwxxxcom/xxxrar>點擊下載文件</a>
但是實際情況可能會稍復雜比如需要用戶填寫完整注冊信息後才可以下載該文件這時最先想到的是使用Redirect的方式下面介紹兩種方式
()用Redirect方式先檢查表格是否已經填寫完畢和完整然後將鏈接指到該文件這樣用戶就可以下載請看下面的示例代碼
<?php
/*文件功能檢查變量form是否完整*/
if($form){
//重新定向浏覽器指向
Header(Location: http:// http://wwwxxxcom/xxxrar)
exit;
}
?>
()根據下載文件的序號來查找鏈接的形式如下
<a href=http://wwwxxxcom/downloadphp?id=>點擊下載文件</a>
上面的鏈接使用ID方式接收要下載文件的編號然後再用Redirect的方式連接到真實的文件鏈接
以上這兩種方法雖然實現了文件的下載功能但是缺點是直接暴露了文件所屬的路徑而且沒有防盜鏈的功能所以上面的方式是簡單直接但存在安全隱患的文件下載方式在PHP中通常是利用header()函數和fread()函數來實現安全的文件下載
例如需要下載的是一個文件名為xxxrar的文件首先創建文件是downloadphp的PHP文件通過前面的例子很容易通過文件的ID號從數據庫中得到待下載文件的真實位置在獲得文件的真實存儲位置後可以通過header()函數的location參數直接重定向到這個文件但是這樣仍然是不安全的因為某些下載軟件還是可以通過重定向分析獲得該文件的位置信息因此需要用另外一種方法就是PHP的文件處理API函數它是通過fread()函數把文件直接輸出到浏覽器提示用戶下載這樣所有的處理都是在服務器端完成的因此用戶就無法獲得文件具體存儲位置信息的示例代碼如下
<?
$file_name = xxxrar; //下載文件名
$file_dir = /up/; //下載文件存放目錄
//檢查文件是否存在
if (! file_exists ( $file_dir $file_name )) {
echo 文件找不到;
exit ()
} else {
//打開文件
$file = fopen ( $file_dir $file_name r )
//輸入文件標簽
Header ( Contenttype: application/octetstream )
Header ( AcceptRanges: bytes )
Header ( AcceptLength: filesize ( $file_dir $file_name ) )
Header ( ContentDisposition: attachment; filename= $file_name )
//輸出文件內容
//讀取文件內容並直接輸出到浏覽器
echo fread ( $file filesize ( $file_dir $file_name ) )
fclose ( $file )
exit ()
}
?>
【代碼解讀】
上述代碼中程序發送Header信息是用來告訴Apache和浏覽器下載文件的相關信息的contenttype的含義代表文件MIME類型是文件流格式如果在Apache配置裡面把文件的MIME類型設為application/octetstream(如add application/octetstream xxxrar)那麼浏覽器(客戶端)就會知道這是一個文件流格式的文件並提示用戶下載AcceptRanges是一個響應頭標它允許服務器指明將在給定的偏移和長度處為資源組成部分的接受請求該頭標的值被理解為請求范圍的度量單位ContentLength是指定包含於請求或響應中數據的字節長度例如ContentLength:ContentDisposition:attachment是用來告訴浏覽器文件是可以當做附件被下載下載後的文件名稱為$file_name該變量的值
運行downloadphp文件效果如圖所示從圖中可以看到文件按照預想的方式被提示下載單擊保存按鈕將文件保存在本地
圖 PHP文件安全下載
返回目錄PHP典型模塊與項目實戰大全
編輯推薦
Java Web開發詳解
PHP Web開發學習實錄
ASP NET開發培訓視頻教程
From:http://tw.wingwit.com/Article/program/PHP/201311/21519.html