【问题标题】:Correctly setting headers so a file can be downloaded via a proxy using PHP正确设置标题,以便可以使用 PHP 通过代理下载文件
【发布时间】:2010-10-18 09:12:32
【问题描述】:

我发现很难正确表达这个问题,让我试着解释一下我们的问题......

我们有一个内部网运行在带有 Apache2/PHP 5.2.4 的 Ubunutu 机器上。我们有一段 PHP 代码,它从一个不可公开访问的目录中读取一个文件并将其输出到屏幕上(代码如下):

$file_path = '/home/path/to/filename.gif';

if(file_exists($file_path)){
    $output = FALSE;

    //File Information
    $path_parts = pathinfo($file_path);
    $file_size = filesize($file_path);
    $file_ext = (isset($path_parts['extension'])) ? strtolower($path_parts['extension']) : null;    
    $file_name = $path_parts['basename'];        

    //Sets up the headers    
    if($file_size > 0){
        header('Content-Length: ' .$file_size);
    }                    
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
    header('Content-Type: application/octet-stream');


    //Reads the File
    if($file_size > 0){
        $handle = fopen($file_path, "r");
        $output = fread($handle, $file_size);
        fclose($handle);
    }

    //Outputs the File
    echo $output;
}

在我们的网络中,当浏览到使用此代码的页面时,文件会完美快速地下载... 但是,当通过我们的 Cisco ASA/Proxy/VPN(不知道该怎么称呼它)访问此页面时,此代码会锁定浏览器,但最终会下载文件...

经过一番试验,取出标题并将文件内容回显到浏览器后,它打印没有问题。但是,一旦我将带有标题的行添加回代码中,它就会再次导致挂起,但仅在通过此框访问时..

有人遇到过这个问题,或者知道我们可以尝试前进吗?

感谢您的建议...

【问题讨论】:

  • 您的代理是否想在将整个文件转发到浏览器之前下载整个文件?也许这取决于内容类型?如果将 Content-Type 更改为 image/gif 会发生什么?它仍然“锁定浏览器”吗?
  • 如果我使用“Content-Type: image/gif”,它可以正常工作...
  • 如果是这种情况...我怎样才能下载任何文件... pdfs、docs、xls 文件而不挂起?
  • 如何在 Java 的 Kendo ProxyURL 代码中设置标头?

标签: php proxy http-headers


【解决方案1】:

您是否尝试过完全消除 content-size 标头?代理可能会将其视为一个坚定的承诺,如果您发送的数据最终大小不同,代理可能会等待最后几个“丢失”字节出现。

顺便说一句,您应该使用[readfile()][1] 而不是您现在拥有的 fopen()/fread()/echo 构造。

就目前而言,您将整个文件的内容吞入内存,然后回显。对于大文件和多个请求,您将因内存不足而终止服务器。 readfile 将自动以较小的块流式传输文件,从而最大限度地减少内存使用。

【讨论】:

  • 感谢 readfile() 提示...我已尝试完全消除内容大小标题...无济于事:-(
【解决方案2】:

您的代理显然存在 Content-Type: application/octet-stream 的问题。尝试将其设置为每个文件的真实 MIME 类型。您可以使用Fileinfo 模块找出某个文件的 MIME 类型,如下所示:

//You may need to specify the location of your system's magic file
//See http://php.net/finfo_open for more info
$finfo = new finfo(FILEINFO_MIME);
$mimetype = $finfo->file($file_path);

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2021-03-20
    • 2010-10-29
    • 2018-01-12
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多