當前位置:首頁 » 編程語言 » php實現文件的下載

php實現文件的下載

發布時間: 2023-06-09 12:15:24

『壹』 php典型模塊與項目實戰大全:PHP文件下載的原理及實現

PHP文件下載的原理及實現

通常文件下載過程是十分簡單的 建立一個鏈接指向到目標文件就可以了 例如下面的鏈接

<a href=// xxx /xxx rar>點擊下載文件</a>

但是 實際情況可能會稍復雜 比如需要用戶填寫完整注冊信息後才可以下載該文件 這時最先想到的是使用Redirect的方式 下面介紹兩種方式

( )用Redirect方式 先檢查表格是否已經填寫完畢和完整 然後將鏈接指到該文件 這樣用戶就可以下載 請看下面的示例代碼

<?php

/*文件功能 檢查變數form是否完整*/

if($form){

//重新定向瀏覽器指向

Header( Location: // // xxx /xxx rar )

exit;

}

?>

( )根據下載文件的序號來查找 鏈接的形式如下

<a href= // xxx /download php?id= >點擊下載文件</a>

上面的鏈接使用ID方式接收要下載文件的編號 然後再用Redirect的方式連接到真實的文件鏈接

以上這兩種方法雖然實現了文件的下載功能 但是缺點是直接暴露了文件所屬的路徑 而且沒有防盜鏈的功能 所以上面的方式是簡單直接但存在安全隱患的文件下載方式 在PHP中 通常是利用header()函數和fread()函數來實現安全的文件下載

例如 需要下載的是一個文件名為xxx rar的文件 首先創建文件是download php的PHP文件 通過前面的例子很容易通過文件的ID號從資料庫中得到待下載文件的真實位置 在獲得文件的真實存儲位置後 可缺培悉以通過header()函數的location參數直接重定向到這個文件 但是這樣仍然是不安全的 因為某些下載軟體還是可以通過重定向分析獲得該文件的位置信息 因此需要用另外一種方法 就是PHP的文件處理API函數 它是通過fread()函數把文件直接輸出到瀏覽器提示用戶下載 這樣所有的處理都是在伺服器端完成的 因此用戶就無法獲得文件具體存儲位置信息的 示例代碼如下

<?

$file_name = xxx rar ; //下載文件名

$file_dir = /up/ ;中纖 //下載文件存放目錄

//檢查文件是否存在

if (! file_exists ( $file_dir $file_name )) {

echo 文件找不到 ;

exit ()

} else {

//打開文件

$file = fopen ( $file_dir $file_name r )

//輸入文件標簽

Header ( Content type: application/octet stream )

Header ( Accept Ranges: bytes )

Header ( Accept Length: filesize ( $file_dir $file_name ) )

Header ( Content Disposition: attachment; filename= $file_name )

//輸出文件內容

//讀取文件內容並直接輸出到瀏覽器

echo fread ( $file filesize ( $file_dir $file_name ) )

fclose ( $file )

exit ()

}

?>

【代碼解讀】

上述代碼中 程序發送Header信息是用來告訴Apache和瀏覽器下載文件的相關信息的 content type的含義代表文件MIME類型是文件流格式 如果在Apache配置裡面把文件的MIME類型設為application/octet stream(如add application/octet stream xxx rar) 那麼瀏覽器(客戶端伏乎)就會知道 這是一個文件流格式的文件並提示用戶下載 Accept Ranges是一個響應頭標 它允許伺服器指明將在給定的偏移和長度處 為資源組成部分的接受請求 該頭標的值被理解為請求范圍的度量單位 Content Length是指定包含於請求或響應中數據的位元組長度 例如 Content Length: Content Disposition:attachment是用來告訴瀏覽器 文件是可以當做附件被下載 下載後的文件名稱為$file_name該變數的值

運行download php文件 效果如圖 所示 從圖中可以看到文件按照預想的方式被提示下載 單擊 保存 按鈕將文件保存在本地

圖 PHP文件安全下載

返回目錄 PHP典型模塊與項目實戰大全

編輯推薦

Java Web開發詳解

PHP Web開發學習實錄

lishixin/Article/program/PHP/201311/21519

『貳』 php實現文件下載代碼~

echo "<a href='$file'>".$file."</a>"需要絕對路徑,而且注意目錄是不可以下載的。
<?php
$root="d:/";
if(is_dir($root)){
$openHandle=opendir($root);
while(false!==($file=readdir($openHandle))){
if(!is_dir($root.$file))
echo "<a href='$root$file'>".$file."</a><br/>";

}
closedir($openHandle);
}
else {
echo "文件夾不存在";
}

?>

『叄』 php實現文件下載代碼

簡單的文件下載只需要使用HTML的連接標記<a>,並將屬性href的URL值指定為下載的文件即可。所示:

<a href=」http://www.*****.net/download/book.rar」>下載文件</a>

如果通過上面的代碼實現文件下載,只能處理一些瀏覽器不能默認識別的MIME類型文件,例如當訪問book.rar文件時,瀏覽器並沒有直接打開,而是彈出一個下載提示框,提示用戶「下載」還是「打開」等處理方式。但如果需要下載後綴名為.html的網頁文件、圖片文件及PHP程序腳本文件等,使用這種連接形式,則會將文件內容直接輸出到瀏覽器中,並不會提示用戶下載。

為了提高文件的安全性,不希望在<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的所示:

<?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="cookie.jpg";
$file_name="聖誕狂歡.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()函數進行編碼轉換

$file_sub_path() 我使用的是絕對路徑,執行效率要比相對路徑高

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

以上四個Header()是必需的
fclose($fp)可以把緩沖區內最後剩餘的數據輸出到磁碟文件中,並釋放文件指針和有關的緩沖區

『肆』 php里怎麼做下載文件代碼(主要是能夠在蘋果手機里。)

<ahref="a.txt"download>點擊下載a.txt文件</a>

『伍』 PHP如何下載文件

//下載文件文件用絕對路徑
ob_clean();
header('Pragma:public');
header('Last-Modified:'.gmdate('D,dMYH:i:s').'GMT');
header('Cache-Control:no-store,no-cache,must-revalidate');
header('Cache-Control:pre-check=0,post-check=0,max-age=0');
header('Content-Transfer-Encoding:binary');
header('Content-Encoding:none');
header('Content-type:multipart/form-data');
header('Content-Disposition:attachment;filename="'.$filename.'"');//設置下載的默認文件名
header('Content-length:'.filesize($dfile));//要下載的文件
$fp=fopen($dfile,'r');
while(connection_status()==0&&$buf=@fread($fp,8192)){
echo$buf;
}
fclose($fp);
@unlink($dfile);
@flush();
@ob_flush();
exit();

『陸』 thinkphp的http::download怎麼做下載文件

公交卡更厲害

『柒』 PHP中怎麼用代碼實現文件下載

CI框架:
前台:a.php <a href="download/export">download</a>
後台:download.php

function export(){
//把js,css的路徑文件名填充下面的$url和$fname就可以了
//至於html文件,先在後台生成一個html文件,然後下載就可以了
$fname=date('YmdHis').'.xls';
$url='./xls/'.$fname;
$this->excel_m->write($url);

$file = fopen($url,"r"); // 打開文件
// 輸入文件標簽
header('Content-Encoding: utf-8');
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: ".filesize($url));
header('Content-Transfer-Encoding: binary' );
header("Content-Disposition: attachment; filename=" .$fname); //以真實文件名提供給瀏覽器下載
header('Pragma: no-cache');
header('Expires: 0');
//輸出文件內容
echo fread($file,filesize($url));
fclose($file);
}

『捌』 怎樣才能用PHP語言實現網頁中的下載文件功能

<?php
/*
$file------文件名
$_SERVER['DOCUMENT_ROOT']-----伺服器跟目標
down------自定義下載文件的文件夾
獲取文件在文件夾裡面的位置
必須是絕對路徑
Content-Type:application/force-download強制瀏覽器下載
*/
$file="xxxx.rar";

$file=$_SERVER['DOCUMENT_ROOT']."/down/".$file;


if(is_file($file)){
header("Content-Type:application/force-download");
header("Content-type:application/octet-stream");
header("Content-Disposition:attachment;filename=".basename($file));
readfile($file);
exit;
}else{
echo"文件不存在!";
exit;
}
?>

『玖』 如何實現php點擊時下載txt文件功能 詳細

php 點擊下載txt 文件 由於現在的瀏覽器已經可以識別格式為txt 的文檔格式,所以如果只是給txt 文檔做一 個文字鏈接的話,可能只是打開一個新窗口顯示txt 文件的內容,並不能實現點擊下載的目 的。We have to do something else. 當然這個問題的解決辦法也可以是你將你的txt 文件改名為瀏覽器不認識的文件,比如 rar,這樣的話點擊,瀏覽器不認識就只好讓用戶下載了。 下面這個文件就是通過設置header 設置文檔的格式來實現點擊下載的目的,將上個頁面傳 遞過來的文件點擊可以下載。 接著第二個header函數設置了要下載的文件,注意這里filename是不包含路徑的文件名, 所以用basename 過濾掉路徑名。這個 filename 的值將來就是點擊下載後彈出對話框裡面的 文件名,如果帶路徑的話,彈出對話框的文件名就是未知的,這個要注意,我就犯了這個錯 誤,後來憑 經驗自己改了,居然對了。 最後就是 readfile,將文件流輸出到瀏覽器,這樣就實現了 txt 文件的下載,其他類型的類似。

『拾』 怎樣用多文件php實現多文件下載

好可憐啊,誰給你的任務,這個是不可能的,和框架、語言都沒關系,是不是你的上級看錯了文檔啊,人家要求多個文件用zip打包下載(比如把文檔中的「別忘了用zip」看成「別用zip」)

這種只能js同時彈出多窗口了,例如

<formclass="download_form"target="download_url_1"action="download_url_1"></form>
<formclass="download_form"target="download_url_2"action="download_url_2"></form>
...
<buttononclick="$('form.download_form').each(function(){this.submit();})"type="button">點</button>

只要下載是正常的,這種彈出會在用戶操作後(下載或取消)自動消失的。但是用戶要一個一個點還是很差勁的用戶體驗。

window.open也行,但是容易受瀏覽器彈窗設置影響,所以不建議。

熱點內容
汽車小組件怎麼弄到安卓桌面 發布:2025-05-16 13:51:12 瀏覽:218
linuxg編譯器下載 發布:2025-05-16 13:50:58 瀏覽:775
centosc編譯器 發布:2025-05-16 13:50:17 瀏覽:946
安卓手機如何變換桌面 發布:2025-05-16 13:39:33 瀏覽:514
sql存儲過程命令 發布:2025-05-16 13:17:54 瀏覽:145
用紙做解壓小玩具西瓜 發布:2025-05-16 13:04:09 瀏覽:935
區域網xp無法訪問win7 發布:2025-05-16 13:03:58 瀏覽:942
油卡如何修改密碼 發布:2025-05-16 13:00:35 瀏覽:901
安卓手機如何拼照片 發布:2025-05-16 12:58:23 瀏覽:374
深入淺出python 發布:2025-05-16 12:56:52 瀏覽:655