【PHP】下載檔案但不直接開啟
多數人在下載檔案的頁面直接連結該檔案, 如下寫法 ----
a href="檔名.副檔名"
這在 windows 系統會有一個可能的狀況, 當此類型檔案與 windows 預設開啟功能產生關聯時(通常是以副檔名為判斷依據), 一點擊這個下載連結時, windows 就會自動啟動此類型檔案的程式並開啟此檔案, 例如:
下載的檔案為 demo.txt, 而 .txt 檔在 windows 預設的開啟程式為記事本, 所以一點擊此連結, windows 便會啟動記事本並開啟 demo.txt, 但實際上我們所希望的是真正的下載 demo.txt 並儲存在硬碟內.
要達到此目的, 我們需要另一個專門下載檔案的 PHP 小程式, 假設我們將這個小程式命名為 downloadfile.php, 其程式內容如下 ----
if(isset($_GET['file']))
{
// $_GET['file'] 即為傳入要下載檔名的引數
header("Content-type:application");
header("Content-Length: " .(string)(filesize($_GET['file'])));
header("Content-Disposition: attachment; filename=".$_GET['file']);
readfile($_GET['file']);
}
另外, 改寫原下載頁面的 html 語法 ----
a href="downloadfile.php?file=檔名.副檔名"
PHP檔案下載
下載的檔案與實際的檔案不同:
<?php
include("auth1.php"); //可不加上此行
header("Content-type: text/html; charset=utf-8");
$file="./9707.zip"; // 實際檔案的路徑+檔名
$filename="0714.zip"; // 下載的檔名
//指定類型
header("Content-type: ".filetype("$file"));
//指定下載時的檔名
header("Content-Disposition: attachment; filename=".$filename."");
//輸出下載的內容。
readfile($file);
?>
開啟網頁前的認證(auth1.php ):
<? header("Content-type: text/html; charset=utf-8");
if (empty($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Please input"');
header('HTTP/1.0 401 Unauthorized');
echo '請輸入正確的帳號及密碼, 不可以取消!';
exit;
} else {
$correctName="pcschool";
$correctpwd="mysql" ;
if (($_SERVER['PHP_AUTH_USER'] != $correctName) or
($_SERVER['PHP_AUTH_PW'] !=$correctpwd)){
echo "登入失敗,請開啟新的瀏覽器重新登入";
}
}
?>
<?php
include("auth1.php"); //可不加上此行
header("Content-type: text/html; charset=utf-8");
$file="./9707.zip"; // 實際檔案的路徑+檔名
$filename="0714.zip"; // 下載的檔名
//指定類型
header("Content-type: ".filetype("$file"));
//指定下載時的檔名
header("Content-Disposition: attachment; filename=".$filename."");
//輸出下載的內容。
readfile($file);
?>
開啟網頁前的認證(auth1.php ):
<? header("Content-type: text/html; charset=utf-8");
if (empty($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Please input"');
header('HTTP/1.0 401 Unauthorized');
echo '請輸入正確的帳號及密碼, 不可以取消!';
exit;
} else {
$correctName="pcschool";
$correctpwd="mysql" ;
if (($_SERVER['PHP_AUTH_USER'] != $correctName) or
($_SERVER['PHP_AUTH_PW'] !=$correctpwd)){
echo "登入失敗,請開啟新的瀏覽器重新登入";
}
}
?>
Read more: http://jiannrong.blogspot.com/2009/08/php.html#ixzz3ACCzhUCJ
PHP 檔案下載 header 設置
用以下的方式,可以讓大部份瀏覽器 (主要是 IE) 詢問你是否要下載檔案 (而不是直接開啟) 。
<?php
$file_name = "file.name";
$file_path = "/path/to/realfile";
$file_size = filesize($file_path);
header('Pragma: public');
header('Expires: 0');
header('Last-Modified: ' . gmdate('D, d M Y H:i ') . ' GMT');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false);
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $file_size);
header('Content-Disposition: attachment; filename="' . $file_name . '";');
header('Content-Transfer-Encoding: binary');
readfile($file_path);
?>
補充:
•$file_name: 這是給瀏覽器看的檔案名稱,也就是下載視窗會出現的那個檔名;它可以跟實際檔案的名稱不一樣!
•$file_path: 會連到實際檔案的位置,也就是該檔案在伺服器上的真實路徑。
•$file_size: 檔案的大小。
•若php.ini 的 memory_limit 設的太小,會造成網頁一直在讀取, 不會跳出下載視窗的問題。
部分代碼如下
$filename="test.pdf";
$file = dirname(__FILE__)."/upload_file/".$file_name ;//注1
if(file_exists($file)){//注2
header("Expires: 0");
header("Pragma: no-cache");//注3
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-disposition: attachment; filename=' . basename($file)); //注4
header("Content-Type: application/pdf");
header("Content-Transfer-Encoding: binary");
header('Content-Length: ' . filesize($file));
@readfile($filename);
exit(0);
}
解釋一下上面作注的地方
注1:$file = dirname(__FILE__)."/upload_file/".$file_name ;
指定要下載檔案(假設要下載的檔所在資料夾與當前檔所在的資料夾的處在同一級)
注2:if(file_exists($file) 判斷指定檔是否存在。
注3:header("Pragma: no-cache");
這裡若是伺服器便用了SSL,即通過HTTPs來訪問的話。要將no-cache改成private
即header("Pragma: private");
注4: header('Content-disposition: attachment; filename=' . basename($filename));
basename($filename) 取出檔案名
Content-disposition: attachment;點下載後出現下載對話方塊。若不需要出現下載對話方塊直接打開的話,將
attachment改成in-line 即:Content-disposition: in-line;
注意點:要確認一下php.ini中的output_buffering的設定,如果是output_buffering = Off的話,將它修改成如下
output_buffering = 4096
;output_buffering = Off
[PHP 檔案下載]
參考網址 http://blog.roodo.com/jaceju/archives/805389.html
用以下的方式,可以讓大部份瀏覽器 (主要是 IE) 詢問你是否要下載檔案 (而不是直接開啟) 。
$file_name = "file.name";
$file_path = "/path/to/realfile";
$file_size = filesize($file_path);
header('Pragma: public');
header('Expires: 0');
header('Last-Modified: ' . gmdate('D, d M Y H:i ') . ' GMT');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false);
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $file_size);
header('Content-Disposition: attachment; filename="' . $file_name . '";');
header('Content-Transfer-Encoding: binary');
readfile($file_path);
?>
[PHP 讀大檔]
$fp = fopen("sn.txt", "r");
while (!feof($fp)) {
$content. = fgets($fp);
}
[php寫入成 excel檔, 並可從網頁下載]
header("Content-Disposition:filename=myfile.xls");
header("Content-type:application/vnd.ms-excel");
$content = "a \t b\t c\t d\n";
$content .= "e \t f\t g\t h\n";
echo $content;
?>
作者已經移除這則留言。
回覆刪除