第一步:准备工作

首先,你需要一份要下载的文件。假设我们在项目的某个目录下有个文件,路径为 `/uploads/example.pdf`。当然,这个文件可以是任何格式的,如 PDF、TXT、图片、音频等。只要你想让用户下载的文件都可以。

第二步:定义下载方法

在 ThinkPHP 的控制器中,我们可以定义一个下载的方法。通常,找到对应的控制器文件,比如 `FileController.php`,然后我们可以在这里编写下载逻辑。

public function download($filename) {
    // 文件路径
    $filePath = ROOT_PATH . 'public/uploads/' . $filename;

    // 检查文件是否存在
    if (!file_exists($filePath)) {
        return json(['code' => 404, 'message' => '文件不存在']);
    }

    // 设置响应头
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($filePath));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($filePath));

    // 清空输出缓冲区
    ob_clean();
    flush();

    // 读取文件并输出
    readfile($filePath);
    exit;
}

第三步:如何安全下载

为了安全起见,始终使用合法的文件名,切记不要直接让用户输入文件名。可以使用一个合法的清单来验证下载的文件。比如,你可以将所有可下载文件的文件名与用户输入的进行比对。

$allowedFiles = ['example.pdf', 'sample.txt']; // 允许下载的文件列表
if (!in_array($filename, $allowedFiles)) {
    return json(['code' => 403, 'message' => '不允许下载此文件']);
}

第四步:前端展示

一般来说,我们在前端会有个按钮或链接,用户点击后就会触发下载。你可以通过 AJAX 请求来实现,当然也可以使用普通的链接。下面是一个简单的例子:

下载文件

第五步:补充注意事项

在实现文件下载时,有几个小细节需要注意:

  • 确保你的文件路径是正确的,尤其是在不同环境(本地、生产)中部署时。
  • 如果用户下载大文件,考虑到服务器性能,使用合适的文件流处理方式。
  • 考虑缓存控制,以避免用户重复下载同一文件时的性能问题。

总结

在ThinkPHP框架中实现下载功能其实并不复杂,只需设置好响应头,处理好文件路径和安全性,就可以顺利完成。希望这些信息能帮助到你,下次如果在项目里还遇到类似的问题,就可以参考这个方法哦!

如果有什么疑问,随时可以问我!