【发布时间】:2011-09-04 18:07:06
【问题描述】:
我有一个文件
/file.zip
一个用户来到
/download.php
我希望用户的浏览器开始下载文件。我怎么做? readfile 是否在服务器上打开文件,这似乎是不必要的事情。有没有办法在不打开服务器的情况下返回文件?
【问题讨论】:
标签: php
我有一个文件
/file.zip
一个用户来到
/download.php
我希望用户的浏览器开始下载文件。我怎么做? readfile 是否在服务器上打开文件,这似乎是不必要的事情。有没有办法在不打开服务器的情况下返回文件?
【问题讨论】:
标签: php
我想你想要这个:
$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-Type: application/octet-stream"); 使其适用于所有文件类型,而不仅仅是.zip。
如果文件可公开访问,只需对文件的 URL 执行简单的redirect。
【讨论】:
readfile 将完成工作并将流直接传递回网络服务器。这不是最好的解决方案,因为文件发送的时间,PHP 仍然运行。为了获得更好的结果,您需要 X-SendFile 之类的东西,大多数网络服务器都支持它(如果您安装了正确的模块)。
一般来说(如果您关心重负载),最好在您的主应用程序服务器前面放置一个代理网络服务器。这将更快地释放您的应用程序服务器(例如 apache),并且代理服务器(Varnish、Squid)往往更擅长将字节传输到具有高延迟或通常速度较慢的客户端。
【讨论】:
如果文件是公开的,那么您可以直接从 Web 服务器(例如 Apache)将其作为静态文件提供,然后将 download.php 重定向到静态 URL。否则,您必须在验证用户身份后使用 readfile 将文件发送到浏览器(请记住 Content-Dispositon 标头)。
【讨论】: