当前位置:首页 > 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 组合实现流式下载。

$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 导出),可以直接输出内容并设置下载头部。

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 {
    // 普通下载处理
}

下载进度显示

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

php 实现下载功能

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 功能实现指南 Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用。以下是 Vue 功能实现的关键方法和技术。 数据绑定与响应式 Vue 的核心特性是数据绑定和响应式系统。通过 d…

uniapp实现支付功能

uniapp实现支付功能

支付功能实现概述 在UniApp中实现支付功能通常需要对接第三方支付平台(如微信支付、支付宝支付等)。以下是基于微信支付和支付宝支付的通用实现流程。 微信支付实现步骤 1. 配置支付权限 在微信开放…

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备与绑定 准备一个包含所有数据的数组,并使用v-model或v-…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…