当前位置:首页 > PHP

php怎么实现下载

2026-01-28 23:28:11PHP

实现文件下载的基本方法

在PHP中实现文件下载通常通过设置HTTP头信息强制浏览器触发下载行为。核心代码如下:

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

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

处理大文件下载

对于大文件下载需要优化内存使用,避免直接读取整个文件:

php怎么实现下载

$chunk_size = 1024 * 1024; // 1MB chunks
$handle = fopen($file_path, 'rb');
while (!feof($handle)) {
    echo fread($handle, $chunk_size);
    ob_flush();
    flush();
}
fclose($handle);

安全下载控制

为防止目录穿越攻击,应对文件路径进行验证:

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

if ($real_path === false || strpos($real_path, $base_dir) !== 0) {
    die('Invalid file path');
}

断点续传支持

实现HTTP Range请求支持断点续传:

php怎么实现下载

$file_size = filesize($file_path);
$start = 0;
$end = $file_size - 1;

if (isset($_SERVER['HTTP_RANGE'])) {
    preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
    $start = (int)$matches[1];
    $end = isset($matches[2]) ? (int)$matches[2] : $file_size - 1;

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

header('Accept-Ranges: bytes');
header('Content-Length: '.($end - $start + 1));

$handle = fopen($file_path, 'rb');
fseek($handle, $start);

下载统计与限速

添加下载统计和速度限制功能:

$speed_limit = 1024 * 50; // 50KB/s
$start_time = microtime(true);
$bytes_sent = 0;

while (!feof($handle) && connection_status() == 0) {
    $buffer = fread($handle, $speed_limit);
    echo $buffer;
    $bytes_sent += strlen($buffer);

    $elapsed = microtime(true) - $start_time;
    $should_take = $bytes_sent / $speed_limit;
    if ($elapsed < $should_take) {
        usleep(($should_take - $elapsed) * 1000000);
    }

    ob_flush();
    flush();
}

常见问题处理

处理文件名编码问题:

$user_agent = $_SERVER['HTTP_USER_AGENT'];
$encoded_filename = rawurlencode($file_name);

if (preg_match('/MSIE|Trident/i', $user_agent)) {
    header('Content-Disposition: attachment; filename="'.iconv('UTF-8', 'CP932//IGNORE', $file_name).'"');
} elseif (preg_match('/Firefox/i', $user_agent)) {
    header('Content-Disposition: attachment; filename*=UTF-8\'\''.$encoded_filename);
} else {
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
}

标签: php
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。…

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现表单

php实现表单

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

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searc…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_…