TShopping

 找回密碼
 註冊
搜索
查看: 3130|回復: 1
打印 上一主題 下一主題

[教學] PHP利用header做檔案下載控制

[複製鏈接]
跳轉到指定樓層
1#
發表於 2010-4-23 00:40:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
這筆者本人有測試過的
很多公家機關都會要求要讓使用者下載 Microsoft Office 檔案的功能,但是 Internet Explorer 總是會自作聰明的幫你打開,哪要如何做到這個功能呢?


其實這個是要在 HTTP Header 的 Content-Disposition 加一個 「attachment;」 在檔名的前面。
以 PHP 為例就是:
header( "Content-Disposition: attachment; filename=xxx.doc;" );
以下是 PHP 完整的下載範例,記得「副檔名一定要限定,不然伺服器上很多重要的檔案都會被別人下載看光光了」。

  1. <?
  2. $filename = $_GET['file'];
  3. /*
  4. 也可以在這裡可以加上路徑,如改為 $filename = "/download/".$_GET['file'];
  5. */

  6. $ext = substr($filename,-3 );
  7. echo $filename;
  8. if( $filename == "" ) {
  9. echo "<html><body>未指定檔案路徑及名稱!</body></html>";
  10. exit;
  11. } elseif ( ! file_exists( $filename ) ) {
  12. echo "<html><body>找不到檔案!</body></html>";
  13. exit;
  14. };
  15. switch ($ext) {
  16.     case 'pdf': $ctype="application/pdf"; break;
  17.      case 'exe': $ctype="application/octet-stream"; break;
  18.      case 'zip': $ctype="application/zip"; break;
  19.      case 'doc': $ctype="application/msword"; break;
  20.      case 'xls': $ctype="application/vnd.ms-excel"; break;
  21.      case 'ppt': $ctype="application/vnd.ms-powerpoint"; break;
  22.      case 'gif': $ctype="image/gif"; break;
  23.      case 'png': $ctype="image/png"; break;
  24.      case 'jpeg':
  25.      case 'jpg': $ctype="image/jpg"; break;
  26.      case 'mp3': $ctype="audio/mpeg"; break;
  27.      case 'wav': $ctype="audio/x-wav"; break;
  28.      case 'mpeg':
  29.      case 'mpg':
  30.      case 'mpe': $ctype="video/mpeg"; break;
  31.      case 'mov': $ctype="video/quicktime"; break;
  32.      case 'avi': $ctype="video/x-msvideo"; break;
  33.   default:echo "<html><body>您不可下載這個檔案</body></html>";
  34.   exit();
  35. }

  36. header('Content-Description: File Transfer');
  37. header("Content-Type: $ctype");
  38. header('Content-Disposition: attachment; filename='.basename($filename));
  39. header('Content-Transfer-Encoding: binary');
  40. header('Expires: 0');
  41. header('Cache-Control: cache, must-revalidate, post-check=0, pre-check=0');
  42. header('Pragma: public');
  43. header('Content-Length: ' . filesize($filename));
  44. ob_clean();
  45. flush();
  46. readfile($filename);
  47. exit;
  48. ?>
複製代碼


補充:
ontent-Disposition: attachment;filename: 這是給瀏覽器看的檔案名稱,也就是下載視窗會出現的那個檔名;它可以跟實際檔案的名稱不一樣!
readfile($filename): 會連到實際檔案的位置,也就是該檔案在伺服器上的真實路徑。
Content-Length: ' . filesize($filename): 檔案的大小。

若php.ini 的 memory_limit 設的太小,會造成網頁一直在讀取, 不會跳出下載視窗的問題。
注意點:要確認一下php.ini中php5.5預設的output_buffering是output_buffering = Off的話,將它修改成如下

    
  1. output_buffering = 4096
  2. ;output_buffering = Off
複製代碼


 

臉書網友討論
2#
 樓主| 發表於 2010-4-29 00:15:42 | 只看該作者
檔案有修改過

這是正確版本

版主招募中

*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-25 22:45 , Processed in 0.049693 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表