2013-08-02 124 views
1

我想要一個php腳本來下載任何類型的文件而不打開它。我發現了以下功能,在我看來有點不同,但我不知道哪個更好。請讓我知道哪一個更好,可靠:PHP強制瀏覽器下載文件(兩種方式)

  1. PHP Manual

    $file = 'monkey.gif'; 
    
    if (file_exists($file)) { 
        header('Content-Description: File Transfer'); 
        header('Content-Type: application/octet-stream'); 
        header('Content-Disposition: attachment; filename='.basename($file)); 
        header('Content-Transfer-Encoding: binary'); 
        header('Expires: 0'); 
        header('Cache-Control: must-revalidate'); 
        header('Pragma: public'); 
        header('Content-Length: ' . filesize($file)); 
        ob_clean(); 
        flush(); 
        readfile($file); 
        exit; 
    } 
    
  2. 從其他教程:

    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header("Content-Disposition: attachment; filename=\"{$file->filename}\""); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . $filesize); 
    
    // download 
    // @readfile($file_path); 
    $dwn_file = @fopen($file_path,"rb"); 
    if ($dwn_file) { 
        while(!feof($dwn_file)) { 
        print(fread($dwn_file, 1024*8)); 
        flush(); 
        if (connection_status()!=0) { 
         @fclose($dwn_file); 
         die(); 
        } 
        } 
        @fclose($dwn_file); 
    } 
    

回答

5

兩者其實當你看到非常相似在正在發送的頭文件中,這是強制下載的原因。區別在於如何讀取文件。第一個使用readfile()作爲抽象,而第二個讀取每個字節的字節。

第二個示例還使用@符號幾次到suppress errors這可能不是一件好事情要複製。

我會使用PHP手冊中的代碼。它更簡單,不易出錯,更具可讀性。

1

它們都基本相同。你想要的是標題

header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=\"{$file->filename}\""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . $filesize); 
header('Content-Type: image/gif'); 

然後簡單地輸出文件。這可以通過多種方式完成,但我會推薦:

readfile($filename); 

因爲它是不言自明的。它將讀取文件並將其輸出到輸出緩衝區(即瀏覽器)。

但請注意,如果您正在輸出的內容類型標頭應設置爲圖像/ gif。

0

這是一個意見,但我會使用第一個,它更快更乾淨。