【问题标题】:How to return a file in PHP如何在 PHP 中返回文件
【发布时间】:2011-09-04 18:07:06
【问题描述】:

我有一个文件

/file.zip

一个用户来到

/download.php

我希望用户的浏览器开始下载文件。我怎么做? readfile 是否在服务器上打开文件,这似乎是不必要的事情。有没有办法在不打开服务器的情况下返回文件?

【问题讨论】:

    标签: php


    【解决方案1】:

    我想你想要这个:

            $attachment_location = $_SERVER["DOCUMENT_ROOT"] . "/file.zip";
            if (file_exists($attachment_location)) {
    
                header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
                header("Cache-Control: public"); // needed for internet explorer
                header("Content-Type: application/zip");
                header("Content-Transfer-Encoding: Binary");
                header("Content-Length:".filesize($attachment_location));
                header("Content-Disposition: attachment; filename=file.zip");
                readfile($attachment_location);
                die();        
            } else {
                die("Error: File not found.");
            } 
    

    【讨论】:

    • 它的工作。文件名中带有空格的下载标题只需添加 header("Content-Disposition: attachment; filename=\"".file.zip."\"");
    • 您可以只使用header("Content-Type: application/octet-stream"); 使其适用于所有文件类型,而不仅仅是.zip
    • 请任何人支持我使用相同的代码,但它在浏览器中打开文件而不是下载它
    【解决方案2】:

    如果文件可公开访问,只需对文件的 URL 执行简单的redirect

    【讨论】:

    • 我不能投反对票;但我愿意。问题是;如何使文件可以访问 php 脚本。我想我们知道我们可以直接访问文件,但是使用 php 脚本作为中间人提供控制。例如,我想允许某些用户下载,这些文件甚至可以在数据库中。
    • 如果可以的话,我会否决您的评论! :) OP 正在使用 PHP,并希望浏览器下载文件。您可以使用 PHP 创建重定向——这可能是 OP 没有发生的事情。 DarkDust 的回答符合要求并且有效。
    • 我对你们俩都投了赞成票,因为你们都提出了有效的观点。
    【解决方案3】:

    readfile 将完成工作并将流直接传递回网络服务器。这不是最好的解决方案,因为文件发送的时间,PHP 仍然运行。为了获得更好的结果,您需要 X-SendFile 之类的东西,大多数网络服务器都支持它(如果您安装了正确的模块)。

    一般来说(如果您关心重负载),最好在您的主应用程序服务器前面放置一个代理网络服务器。这将更快地释放您的应用程序服务器(例如 apache),并且代理服务器(Varnish、Squid)往往更擅长将字节传输到具有高延迟或通常速度较慢的客户端。

    【讨论】:

      【解决方案4】:

      如果文件是公开的,那么您可以直接从 Web 服务器(例如 Apache)将其作为静态文件提供,然后将 download.php 重定向到静态 URL。否则,您必须在验证用户身份后使用 readfile 将文件发送到浏览器(请记住 Content-Dispositon 标头)。

      【讨论】:

        猜你喜欢
        • 2013-11-14
        • 2022-01-18
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        相关资源
        最近更新 更多