php下載文件的流程:
其實就是給予一個鏈接: <a href="指向處理文件的地址"></a> 這樣,當前端點擊鏈接的時候,指向處理文件,比如download.php
本例題 在download.php同級目錄下有resume.docx文件
<?php
$file_name = 'resume.docx';
$file_sub_path =$_SERVER['DOCUMENT_ROOT'].__ROOT__.'/Public/Download/';
$file_path = $file_sub_path.$file_name;
if (!file_exists($file_path)){ //判斷文件是否存在
echo "文件不存在";
exit();
}
$fp = fopen($file_path,"r+") or die('打開文件錯誤'); //下載文件必須要將文件先打開。寫入內存
$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;
while(!feof($fp)){
$file_data = fread($fp,$buffer);
echo $file_data;
}
fclose($fp);
}
知識點:
$_SERVER['DOCUMENT_ROOT'] 服務器的根路徑,比如我的電腦上是 d:wamp/www
__ROOT__是THINKPHP中的用法,指向項目的根路徑,比如我的電腦是/tpblog
$file_sub_path 指向,所需要下載文件的路徑 d:wamp/www/tpblog/Public/Download
但是我遇到了一個問題,就是如果文件名改成中文的話,就會出現文件不存在的錯誤
后來找到解決辦法是
在開始申明
header("Content-type: text/html;charset=utf-8");
申明網頁的編碼格式
然后強制轉換編碼
$file_name = iconv("utf-8","gbk//IGNORE",$file_name);
把UTF-8的編碼強制轉換為GBK
完整代碼如下:
本例題 在download.php同級目錄下有測試簡歷.docx文件
header("Content-type: text/html;charset=utf-8");
$file_name = '測試簡歷.docx';
$file_name = iconv("utf-8","gbk//IGNORE",$file_name);
$file_sub_path =$_SERVER['DOCUMENT_ROOT'].__ROOT__.'/Public/Download/';
$file_path = $file_sub_path.$file_name;
if (!file_exists($file_path)){ //判斷文件是否存在
echo "文件不存在";
exit();
}
$fp = fopen($file_path,"r+") or die('打開文件錯誤'); //下載文件必須要將文件先打開。寫入內存
$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;
while(!feof($fp)){
$file_data = fread($fp,$buffer);
echo $file_data;
}
fclose($fp);