2013-08-02 98 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

这是一个意见,但我会使用第一个,它更快更干净。