2026-04-30 02:54:38
首先,你需要一份要下载的文件。假设我们在项目的某个目录下有个文件,路径为 `/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框架中实现下载功能其实并不复杂,只需设置好响应头,处理好文件路径和安全性,就可以顺利完成。希望这些信息能帮助到你,下次如果在项目里还遇到类似的问题,就可以参考这个方法哦!
如果有什么疑问,随时可以问我!