讓 IE 不要開啟預設的檔案格式

很多公家機關都會要求要讓使用者下載 Microsoft Office 檔案的功能,但是 Internet Explorer 總是會自作聰明的幫你打開,哪要如何做到這個功能呢?


其實這個是要在 HTTP Header 的 Content-Disposition 加一個 「attachment;」 在檔名的前面。

以 PHP 為例就是:
header( “Content-Disposition: attachment; filename=xxx.doc;” );

以下是 PHP 完整的下載範例,記得「副檔名一定要限定,不然伺服器上很多重要的檔案都會被別人下載看光光了」。


<?
$filename = $_GET[‘file’];
/*
也可以在這裡可以加上路徑,如改為 $filename = “/download/”.$_GET[‘file’];
*/

$ext = substr($filename,-3 );
echo $filename;
if( $filename == "" ) {
echo "<html><body>未指定檔案路徑及名稱!</body></html>";
exit;
} elseif ( ! file_exists( $filename ) ) {
echo "<html><body>找不到檔案!</body></html>";
exit;
};
switch( $ext ){
 case "pdf": $ctype="application/pdf"; break;
 case "exe": $ctype="application/octet-stream"; break;
 case "zip": $ctype="application/zip"; break;
 case "doc": $ctype="application/msword"; break;
 case "xls": $ctype="application/vnd.ms-excel"; break;
 case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
 case "gif": $ctype="image/gif"; break;
 case "png": $ctype="image/png"; break;
 case "jpg": $ctype="image/jpg"; break;
 default:
  echo "<html><body>您不可以下載這個檔案!</body></html>";
  exit;

}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: $ctype");
$user_agent = strtolower ($_SERVER["HTTP_USER_AGENT"]);
header( "Content-Disposition: attachment; filename=".basename($filename).";"
);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));

$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
print ($contents);
flush();
?>

程式修改自:
http://tw.php.net/manual/tw/function.header.php


14 comments On 讓 IE 不要開啟預設的檔案格式

  • 您好….這功能真的不錯…
    請教您,若用ASP或ASP.NET的話..
    也要寫一大堆程式嗎?

    我的Email有給過您囉…
    2個u @ 2個u .idv.tw

    看的懂嗎?
    沒有垃圾郵件的Email實在很寶貴..
    不太敢在網站上留…

  • 只要寫入的 Header 一樣,用任何語言都可以做。

    我這邊有 ASP.Net 的版本,有需要再 email 來要就好囉!^^

  • 怎麼讓filename支援utf-8或big5的中文!!
    >”<

    感恩~

  • Neo大大您好,是否可以麻煩您提供ASP.Net 的版本,謝謝
    edo0902@hotmail.com

  • Neo您好,是否可以麻煩您提供ASP.Net 的版本給我呢!?,謝謝
    nate.lin@gmail.com

  • 請問我用了上面的程式碼下載回來的檔案都無法使用,
    因為每個檔案的最前頭都會多一行空白,只要把空白自行移除,檔案就可以正常使用,
    我試著改一些程式碼也不知道那一行空白是由那裡產生的?
    可否請大大指點迷津?

  • 可是這樣一來不就無法支援續傳了?

  • elseif ( ! file_exists( $filename ) ) {
    echo “找不到檔案!”;
    exit;
    };
    為什麼elseif 後面多;?

  • justin11:
    哈哈,感謝告知,已修正。

  • read ‘../PHPTEXT/123.xls’;
    $worksheet =& $workbook->addWorksheet (‘My first worksheet’);

    $worksheet->write(0, 0, ‘Mary’);
    $worksheet->write(0, 1, ‘123321’);
    $worksheet->write(1, 0, ‘Tom’);
    $worksheet->write(1, 1, 30);
    $worksheet->write(2, 0, ‘Johann Schmidt’);
    $worksheet->write(2, 1, 31);
    $worksheet->write(3, 0, ‘Juan Herrera’);
    $worksheet->write(3, 1, 32);
    $workbook->close();

    錯誤訊息Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING in d:\appserv\www\phptext\123.php

    能否請教PHP高手!!該如何解決問題!!

  • 我想問問
    有沒有辦法加上下載統計顯示?

  • 請問一下,有沒有辮法將此功能移到PDA上呢?
    我試了相同的CODE在PDA上行不通
    還是會直接開啟檔案
    (例.TXT OR .JPG)

  • 版主您好,謝謝您的分享!
    但我實際coding的時候,pdf檔下載沒問題,但下載doc或xls檔的時候,檔案大小是正確的,開啟檔案的時候卻顯示“word無法啟動轉換程式“,不知您是否瞭解問題在哪裡?

    感謝您的回覆!

  • 我的問題已經找到solution了,
    給有相同疑慮的版友參考:
    http://www.phpx.com/happy/thread-142909-1-8.html

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar