2014年8月12日 星期二

php 檔案下載





【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 "登入失敗,請開啟新的瀏覽器重新登入";

}

}

?>


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;
?>

1 則留言:

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。