📜  在 php 中下载文件(1)

📅  最后修改于: 2023-12-03 15:23:14.976000             🧑  作者: Mango

在 PHP 中下载文件

在 Web 开发中,下载文件是一个常见的需求。PHP 提供了下载文件的功能,并且非常便于使用。本文将介绍在 PHP 中下载文件的方法。

客户端请求下载文件

当用户点击下载链接时,浏览器会发送一个 GET 请求来下载文件。我们需要在 PHP 脚本中处理这个请求。

以下是一个 GET 请求的例子,请求下载名为 example.pdf 的 PDF 文件:

GET /download.php?file=example.pdf HTTP/1.1
Host: example.com
下载文件的 PHP 代码

在 PHP 脚本中,我们需要读取文件并将其发送到客户端。以下是一个下载文件的 PHP 代码片段:

$file = $_GET['file'];  // 获取文件名

// 发送文件头
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));

// 读取文件内容并发送
readfile($file);
exit;

代码解释:

  • 第一行从 GET 请求的参数中获取文件名。
  • 我们使用 header() 函数发送一些 HTTP header,通知浏览器这是个下载文件的请求。其中 Content-Disposition 指定文件名, Content-Type 指定 MIME 类型。
  • readfile() 函数将整个文件内容发送给客户端。
添加安全性检查

为了防止用户下载不应该访问的文件,我们可以在 PHP 脚本中添加一些安全性检查。

以下代码片段演示了如何检查文件名称中的特殊字符,并将文件路径限制在指定目录内:

$basename = basename($file);
if (strpos($basename, '..') !== false || preg_match('/[^A-Za-z0-9_.-]/', $basename)) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}
$filepath = '/path/to/files/' . $basename;
if (!file_exists($filepath)) {
    header('HTTP/1.1 404 Not Found');
    exit;
}
结论

在 PHP 中下载文件非常简单。我们只需要读取文件并将其发送到客户端即可。为了安全起见,可以添加一些安全性检查来防止用户下载不应该访问的文件。