|
這筆者本人有測試過的
很多公家機關都會要求要讓使用者下載 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 'jpeg':
- case 'jpg': $ctype="image/jpg"; break;
- case 'mp3': $ctype="audio/mpeg"; break;
- case 'wav': $ctype="audio/x-wav"; break;
- case 'mpeg':
- case 'mpg':
- case 'mpe': $ctype="video/mpeg"; break;
- case 'mov': $ctype="video/quicktime"; break;
- case 'avi': $ctype="video/x-msvideo"; break;
- default:echo "<html><body>您不可下載這個檔案</body></html>";
- exit();
- }
- header('Content-Description: File Transfer');
- header("Content-Type: $ctype");
- header('Content-Disposition: attachment; filename='.basename($filename));
- header('Content-Transfer-Encoding: binary');
- header('Expires: 0');
- header('Cache-Control: cache, must-revalidate, post-check=0, pre-check=0');
- header('Pragma: public');
- header('Content-Length: ' . filesize($filename));
- ob_clean();
- flush();
- readfile($filename);
- exit;
- ?>
複製代碼
補充:
•ontent-Disposition: attachment;filename: 這是給瀏覽器看的檔案名稱,也就是下載視窗會出現的那個檔名;它可以跟實際檔案的名稱不一樣!
•readfile($filename): 會連到實際檔案的位置,也就是該檔案在伺服器上的真實路徑。
•Content-Length: ' . filesize($filename): 檔案的大小。
若php.ini 的 memory_limit 設的太小,會造成網頁一直在讀取, 不會跳出下載視窗的問題。
注意點:要確認一下php.ini中php5.5預設的output_buffering是output_buffering = Off的話,將它修改成如下
- output_buffering = 4096
- ;output_buffering = Off
複製代碼
|
|