如何在 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 中返回文件的主要内容,如果未能解决你的问题,请参考以下文章