当前位置:首页 > PHP

php如何实现下载功能

2026-04-03 03:18:51PHP

PHP 实现文件下载功能

使用 header() 函数强制下载

通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。

$file = 'path/to/your/file.pdf'; // 文件路径
$filename = 'custom_name.pdf';   // 下载时显示的文件名

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
} else {
    echo "文件不存在!";
}

动态生成内容并下载

适用于需要动态生成内容(如 CSV、文本)的场景。

$content = "姓名,年龄,性别\n张三,25,男\n李四,30,女";
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="data.csv"');
echo $content;
exit;

大文件分块下载

处理大文件时避免内存溢出,使用分块读取。

$file = 'large_file.zip';
$chunk_size = 1024 * 1024; // 1MB 分块

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . basename($file) . '"');
    header('Content-Length: ' . filesize($file));

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

安全注意事项

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

    $base_dir = '/safe/directory/';
    $requested_file = $_GET['file'];
    $real_path = realpath($base_dir . $requested_file);
    
    if (strpos($real_path, $base_dir) === 0 && file_exists($real_path)) {
        // 安全下载逻辑
    }
  • 限制文件类型(如仅允许下载 .pdf.csv)。

进阶:断点续传

支持 HTTP 范围请求(Range),实现断点续传功能:

php如何实现下载功能

$file = 'large_video.mp4';
$size = filesize($file);
$fp = fopen($file, 'rb');

header('Accept-Ranges: bytes');
if (isset($_SERVER['HTTP_RANGE'])) {
    $range = $_SERVER['HTTP_RANGE'];
    list($start, $end) = explode('-', substr($range, 6));
    $start = max(0, intval($start));
    $end = min($size - 1, $end ? intval($end) : $size - 1);
    header('HTTP/1.1 206 Partial Content');
    header("Content-Range: bytes $start-$end/$size");
    header("Content-Length: " . ($end - $start + 1));
    fseek($fp, $start);
    echo fread($fp, $end - $start + 1);
} else {
    header('Content-Length: ' . $size);
    readfile($file);
}
fclose($fp);

分享给朋友:

相关文章

vue实现收货功能

vue实现收货功能

Vue实现收货功能的基本思路 收货功能通常涉及前端界面交互、后端数据更新和状态管理。在Vue中,可以通过组件化开发实现这一功能,结合API调用与状态管理工具(如Vuex或Pinia)。 创建收货按钮…

php实现留言板功能

php实现留言板功能

PHP 留言板功能实现 数据库设计 创建数据库表 messages,包含以下字段: id:自增主键 name:留言者姓名(VARCHAR) email:留言者邮箱(VARCHAR) content:…

vue电影功能实现

vue电影功能实现

Vue 电影功能实现 数据获取与展示 使用 Axios 或 Fetch API 从电影 API(如 TMDb、豆瓣 API)获取数据。在 Vue 的 created 或 mounted 生命周期钩子中…

vue实现后台功能

vue实现后台功能

Vue 实现后台功能的方法 Vue.js 是一个流行的前端框架,适合构建后台管理系统。以下是实现后台功能的常见方法和步骤。 项目初始化 使用 Vue CLI 或 Vite 初始化项目: # Vue…

vue如何实现id

vue如何实现id

Vue 中实现 ID 的方法 在 Vue 中,可以通过多种方式为元素或组件分配唯一的 ID。以下是几种常见的方法: 使用 v-bind 绑定 ID 通过 v-bind 动态绑定 ID,可以在模板中直…

vue如何实现录音

vue如何实现录音

使用Web Audio API实现录音 在Vue中实现录音功能可以通过Web Audio API结合MediaRecorder API来完成。以下是一个基础实现方案: 安装必要的依赖: npm i…