当前位置:首页 > PHP

php下载文件实现

2026-02-27 14:53:46PHP

PHP 实现文件下载

在 PHP 中实现文件下载功能通常涉及设置正确的 HTTP 头信息并输出文件内容。以下是几种常见的实现方式:

使用 readfile() 函数

$file_path = 'path/to/your/file.pdf';
$file_name = basename($file_path);

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$file_name.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));

readfile($file_path);
exit;

使用 fread() 逐块读取大文件

对于大文件,可以分块读取以避免内存问题:

$file_path = 'path/to/large/file.zip';
$file_name = basename($file_path);
$chunk_size = 1024 * 1024; // 1MB chunks

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$file_name.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));

$handle = fopen($file_path, 'rb');
while (!feof($handle)) {
    echo fread($handle, $chunk_size);
    ob_flush();
    flush();
}
fclose($handle);
exit;

实现安全下载

为防止目录遍历攻击,应验证文件路径:

$base_dir = '/safe/download/directory/';
$requested_file = $_GET['file'] ?? '';
$file_path = realpath($base_dir . $requested_file);

// 验证文件是否在允许的目录中
if ($file_path && strpos($file_path, realpath($base_dir)) === 0 && is_file($file_path)) {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
    header('Content-Length: ' . filesize($file_path));
    readfile($file_path);
} else {
    header('HTTP/1.0 404 Not Found');
    echo 'File not found';
}
exit;

强制下载特定 MIME 类型

可以强制浏览器下载而不是显示某些文件类型:

php下载文件实现

$file_path = 'path/to/file.html';
$file_name = basename($file_path);

header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="'.$file_name.'"');
header('Content-Length: ' . filesize($file_path));
readfile($file_path);
exit;

注意事项

  • 确保脚本在输出文件内容前没有输出任何其他内容(包括空格和换行符)
  • 对于大文件下载,考虑增加 PHP 执行时间限制:set_time_limit(0)
  • 在生产环境中应添加适当的权限检查和日志记录
  • 考虑使用 X-Sendfile(如 Apache 的 mod_xsendfile)来提高大文件下载性能

标签: 文件php
分享给朋友:

相关文章

vue实现文件的上传

vue实现文件的上传

Vue 文件上传实现方法 使用原生 HTML 文件输入元素 在 Vue 组件中可以直接使用 HTML 的原生文件上传控件,通过 v-on 监听 change 事件获取文件对象。 <templa…

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php实现定时

php实现定时

PHP 实现定时任务的方法 PHP 本身是脚本语言,通常需要借助外部工具或框架实现定时任务。以下是几种常见方法: 使用 Cron 任务 Linux 系统自带的 Cron 是常用的定时任务工具。通过编…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…