当前位置:首页 > PHP

php 实现下载功能

2026-02-27 18:08:43PHP

使用 header 函数实现文件下载

在 PHP 中可以通过设置 HTTP 头部信息实现文件下载功能。核心是使用 header() 函数设置正确的 Content-Type 和 Content-Disposition。

$file_path = '/path/to/file.pdf';
$file_name = 'document.pdf';

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file_name . '"');
header('Content-Length: ' . filesize($file_path));

readfile($file_path);
exit;

处理大文件下载

对于大文件下载,需要分块读取以避免内存问题。可以使用 fopenfread 组合实现流式下载。

php 实现下载功能

$file_path = '/path/to/large_file.iso';
$chunk_size = 1024 * 1024; // 1MB chunks

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

安全下载控制

为防止未授权访问,应在下载前验证用户权限。可以结合会话验证或 token 机制。

session_start();
if (!isset($_SESSION['user_id'])) {
    die('Access denied');
}

$allowed_files = ['report1.pdf', 'data.xlsx'];
$requested_file = $_GET['file'];

if (!in_array($requested_file, $allowed_files)) {
    die('Invalid file request');
}

动态生成内容下载

对于动态生成的内容(如 CSV 导出),可以直接输出内容并设置下载头部。

php 实现下载功能

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');

$output = fopen('php://output', 'w');
fputcsv($output, ['Name', 'Email', 'Phone']);

// 添加数据行
foreach ($users as $user) {
    fputcsv($output, [$user['name'], $user['email'], $user['phone']]);
}

fclose($output);

断点续传支持

实现断点续传功能需要处理 Range 头部,适用于大文件下载场景。

$file_path = '/path/to/large_file.zip';
$file_size = filesize($file_path);

if (isset($_SERVER['HTTP_RANGE'])) {
    $range = $_SERVER['HTTP_RANGE'];
    $range = str_replace('bytes=', '', $range);
    list($start, $end) = explode('-', $range);

    $start = max(0, (int)$start);
    $end = min($file_size - 1, (int)$end);

    header('HTTP/1.1 206 Partial Content');
    header("Content-Range: bytes $start-$end/$file_size");
    header('Content-Length: ' . ($end - $start + 1));

    $fp = fopen($file_path, 'rb');
    fseek($fp, $start);
    $length = $end - $start + 1;
    $buffer = 1024 * 8;

    while ($length > 0) {
        $read = ($length > $buffer) ? $buffer : $length;
        echo fread($fp, $read);
        $length -= $read;
        flush();
    }
    fclose($fp);
} else {
    // 普通下载处理
}

下载进度显示

通过输出缓冲和内容长度计算可以实现简单的进度显示。

ob_start();
$file_path = '/path/to/file';
$file_size = filesize($file_path);
$chunk_size = 1024 * 1024;

header('Content-Length: ' . $file_size);
// 其他头部设置...

$handle = fopen($file_path, 'rb');
$sent = 0;
while (!feof($handle) && $sent < $file_size) {
    $buffer = fread($handle, $chunk_size);
    echo $buffer;
    $sent += strlen($buffer);

    // 可以在此处记录进度到数据库或文件
    $progress = round(($sent / $file_size) * 100);
    file_put_contents('progress.txt', $progress);

    ob_flush();
    flush();
}
fclose($handle);
ob_end_flush();

标签: 功能php
分享给朋友:

相关文章

vue实现拨号功能

vue实现拨号功能

Vue实现拨号功能的方法 使用HTML5的tel协议 在Vue模板中直接使用<a>标签的tel:协议实现拨号功能。这种方法适用于移动端浏览器,点击后会调起系统的拨号界面。 <tem…

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

vue 实现 功能

vue 实现 功能

Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用程序。以下是一些常见的 Vue 功能实现方法: 数据绑定 Vue 的核心特性之一是数据绑定,可以通过 v-model 指令实现双向数据…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Cont…