PHP - 下载文件



大多数现代浏览器允许自动下载某些类型的文件,而无需任何服务器端代码,例如 PHP 脚本。例如,zip 文件或 EXE 文件。

如果 HTML 超链接指向 ZIP 或 EXE 文件,浏览器会下载它并弹出保存对话框。但是,文本文件、图像文件等不会下载,而是在浏览器中打开,您可以将其保存到本地文件系统。

readfile() 函数

要下载此类文件(而不是浏览器自动打开它们),我们可以在 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() 函数返回读取的字节数或 false,即使它已成功完成或未完成。

示例

以下 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”。确保要下载的文件位于同一文件夹中。

启动服务器并在浏览器中访问https://127.0.0.1/download.php。您将获得如下所示的“另存为”对话框 -

PHP Download File

您可以选择名称并下载文件。

对于大型文件,您可以从文件流中以特定预定义大小的块读取它。如果 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);
?>
广告