PHP 文件下载

2025年04月17日 | 阅读 4 分钟

PHP 可以使用内置的 readfile() 函数轻松下载文件。readfile() 函数会读取一个文件并将其写入输出缓冲区。

为什么下载文件?

文件下载是网站的常见功能。这可能包括软件、论文、图片和其他类型的文件。您可以使用 PHP 安全有效地处理这些下载。

对于某些文件格式,大多数现代浏览器无需服务器端编程(如 PHP 脚本)即可自动下载。例如,EXE 文件zip 文件

如果 HTML 超链接指向 ZIP 或 EXE 文件,浏览器会下载该文件并显示保存提示。但是,您可以将文本、图片和其他文件保存到本地文件系统中,而不是让浏览器直接打开它们。

何时使用 PHP 下载文件?

PHP 使文件下载管理变得简单。您可以使用它来控制文件访问并实现安全功能。您可以使用 PHP 来:

  • 允许用户下载图片、视频和 PDF 文件。
  • 确保只有登录用户才能访问文件。
  • 跟踪文件的下载次数。

readfile() 函数

PHP 内置函数库中的 readfile() 方法可用于下载此类文件(而不是让浏览器自动打开它们)。

语法

此函数读取文件,然后将其放入输出缓冲区。

由于第二个选项 $use_include_path 默认为 false,因此将下载当前目录中的文件。如果设置为 true,则通过搜索 php.ini 配置文件中 include_path 参数添加的文件夹来查找要下载的文件。

无论操作成功与否,readfile() 方法都返回读取的字节数或 false。

示例

以下 PHP 脚本使用了 readfile() 方法。

必须将 Content-Type 响应头设置为 application/octect-stream 才能下载文件。对于二进制文件,此 MIME 类型是默认的。通常,浏览器不会运行它,甚至不会询问是否需要。

当 Content-Disposition 头设置为 attachment 时,也会出现“另存为”窗口。

PHP 下载文件示例:文本文件

示例

立即执行

输出

当用户在 浏览器中打开此 PHP 脚本时:

  • 将出现一个下载提示,要求用户下载名为 f.txt 的文件。
  • 该文件的内容将从以下位置获取:https://tpointtech.cn/f.txt。
  • 下载的文件将包含远程 f.txt 文件中的任何内容。
  • 浏览器不显示内容 - 它会立即下载文件。

PHP 下载文件示例:二进制文件

示例

立即执行

输出

当用户访问此 PHP 脚本时:

  • 将出现一个下载对话框。
  • 文件将被下载并保存为 robots.txt。
  • 内容将直接从 'https://tpointtech.com/robots.txt' 流式传输。

使用 file_get_contents() 方法

您也可以使用 file_get_contents() 方法来读取和提供文件内容以供下载。让我们看一个例子。

示例

这是使用 file_get_contents() 方法读取和获取文件内容的示例。

示例

立即执行

my_large_file.txt 和 download.php 的位置应相同。您可以让它们下载任何您想要的任何文件。download_log.txt 该文件由脚本自动创建,用于记录下载尝试。

输出

访问 download.php 时,如果 my_large_file.txt 存在:

  • 名称与 my_large_file.txt 相同的文件的下载将开始。
  • readfile() 用于将文件内容作为二进制流发送。
  • download_log.txt 中的条目将如下所示:
[2025-04-04 16:23:18] 192.168.1.12 successfully downloaded my_large_file.txt

如果文件不存在:

  • 用户将看到一个带有样式的“404 - 文件未找到”消息。
  • 日志将记录失败的尝试。

安全文件下载的最佳方法

以下是一些 PHP 推荐的安全文件下载实践:

  • 文件验证:验证是否允许下载给定文件。
  • 身份验证:只有登录用户才能下载私有文件。
  • 隐藏文件位置:使用脚本管理下载,而不是公开实际文件位置。
  • 限制文件类型:只允许安全的 are 文件格式,例如 TXT、JPEG 和 PDF。
  • 下载限制:为避免在短时间内下载过多,请设置下载限制。

下一主题PHP JSON