Php 简明教程
PHP - Download File
大多数现代浏览器允许自动下载特定类型的文件,无需任何服务器端代码(例如 PHP 脚本)。例如,zip 文件或 EXE 文件。
如果 HTML 超链接指向 ZIP 或 EXE 文件,浏览器将下载它并弹出一个保存对话框。但是,不会下载文本文件、图像文件等,而是在浏览器中打开,您可将其保存到本地文件系统。
The readfile() Function
要下载此类文件(而不是让浏览器自动打开它们),我们可以使用 PHP 内置函数库中的 readfile() 函数。
readfile(string $filename,
bool $use_include_path = false,
?resource $context = null)
: int|false
此函数读取文件并将其写入输出缓冲区。
第二个参数 $use_include_path 默认情况下为 false,因此将下载当前目录中的文件。如果设置为 true ,将搜索添加到 php.ini 配置的 include_path 设置中的目录以找到要下载的文件。
readfile() 函数返回已读取的字节数,即使已成功完成。
Example
以下 PHP 脚本展示了 readfile() 函数的用法。
要下载文件, Content-Type 响应头应该设置为 application/octect-stream 。此 MIME 类型是二进制文件的默认值。浏览器通常不会执行该文件,甚至不会询问是否应该执行。
此外,将 Content-Disposition 头设置为 attachment 将提示“另存为”对话框弹出。
<?php
$filePath = 'welcome.png';
// Set the Content-Type header to application/octet-stream
header('Content-Type: application/octet-stream');
// Set the Content-Disposition header to the filename of the downloaded file
header('Content-Disposition: attachment; filename="'. basename($filePath).'"');
// Read the contents of the file and output it to the browser.
readfile($filePath);
?>
将在文档根文件夹中将上述脚本保存为“download.php”。确保要下载的文件存在于同一文件夹中。
启动服务器,并在浏览器中访问 http://localhost/download.php 。你将获得如下所示的“另存为”对话框 -
你可以选择一个名称并下载该文件。
对于大型文件,你可以从文件流中以一定预定义大小的块中读取它。如果 Content-Disposition 头设置为“attachment”(如前一个示例中),浏览器将提供将其保存在本地文件系统中。
<?php
$filename = 'welcome.png';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
$handle = fopen($filename, 'rb');
$buffer = '';
$chunkSize = 1024 * 1024;
ob_start();
while (!feof($handle)) {
$buffer = fread($handle, $chunkSize);
echo $buffer;
ob_flush();
flush();
}
fclose($handle);
?>