代码之家  ›  专栏  ›  技术社区  ›  gen_Eric

使用php下载脚本发送正确的文件大小

  •  8
  • gen_Eric  · 技术社区  · 15 年前

    我用PHP创建了一个文件下载脚本,它可以工作,但是Web浏览器报告文件为“未知长度”。我的代码如下:

    function downloadFile($file){
      // Set up the download system...
      header('Content-Description: File Transfer');
      header('Content-Type: '.mime_content_type($file));
      header('Content-Disposition: attachment; filename="'.basename($file).'"');
      header('Content-Transfer-Encoding: binary');
      header('Expires: 0');
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
      header('Pragma: public');
      header('Content-Length: '.filesize($file));
    
      // Flush the cache
      ob_clean();
      flush();
    
      // Send file to browser
      readfile($file);
    
      // DO NOT DO ANYTHING AFTER FILE DOWNLOAD
      exit;
    }
    
    3 回复  |  直到 8 年前
        1
  •  15
  •   0b10011 Dragos.    12 年前

    最初来自 http://paul.luminos.nl/update/471 :

    这个 CrimsonBase website 通过传递类似于Andrew Johnson在 his article about PHP-controlled file downloads .

    安德鲁在文章结尾处作了一个非常重要的评论:

    如果使用zlib、mod deflate等压缩文件,那么Content-Length头将不准确,因此下载文件时将看到“未知大小”和“未知剩余时间”。

    我要强调的是:如果您的浏览器似乎没有遵守您的PHP脚本生成的头文件,尤其是 Content-Length 阿帕奇很可能 mod_deflate 已启用扩展。

    您可以使用以下行在适用的 .htaccess 文件:

    SetEnvIfNoCase Request_URI ^/download\.php no-gzip dont-vary
    

    这里假设download.php位于服务器根目录路径(例如 www.crimsonbase.com/download.php )(这是因为正则表达式是 ^/download\.php )

        2
  •  6
  •   Skylar Ittner    8 年前

    我有同样的问题,我通过发送 Content-Length 标题位于 Content-Disposition .

    header('Content-Type: video/mp4');
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-Length: ".filesize($file_url));
    header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
    readfile($file_url);
    
        3
  •  0
  •   user15063    15 年前

    尝试不要在readfile()函数之前刷新缓存。否则,我的代码与您的几乎相同,并且工作正常。