如何在 PHP 中返回文件

Posted

技术标签:

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

我有一个文件

/file.zip

一个用户来到

/download.php

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

【问题讨论】:

【参考方案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.");
         

【讨论】:

仅供参考:What is the risk of having HTTP header “Cache-Control: public”? 它的工作。文件名中带有空格的下载标题只需添加 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 标头)。

【讨论】:

以上是关于如何在 PHP 中返回文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP rest api如何返回文件或下载

如何在 PHP 中返回从 MySQL 获取的数组

如何在PHP中返回Json数据

如何从 PHP 文件加载返回数组?

如何在PHP中获取MYSQL数据库返回的数据的行数?

如何在 PHP 中编写文件上传测试?