当前位置:首页 > PHP

php 实现下载

2026-03-13 15:07:37PHP

实现文件下载的基本方法

在PHP中实现文件下载可以通过设置HTTP头部信息并输出文件内容来完成。以下是基本实现方式:

$file_path = '/path/to/your/file.pdf';
$file_name = 'download.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;

处理大文件下载

对于大文件下载,需要分块读取以避免内存问题:

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

强制下载而非打开

确保浏览器总是弹出下载对话框而非尝试打开文件:

header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');

安全注意事项

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

$base_dir = '/safe/download/directory/';
$file_path = realpath($base_dir . $_GET['file']);
if (strpos($file_path, $base_dir) !== 0) {
    die('Invalid file path');
}

显示下载进度

对于需要显示下载进度的情况,可以计算并输出进度信息:

$total_size = filesize($file_path);
$downloaded = 0;

while (!feof($handle)) {
    $buffer = fread($handle, $chunk_size);
    $downloaded += strlen($buffer);
    $progress = round(($downloaded / $total_size) * 100);
    echo $buffer;
    // 可以在这里记录或输出进度信息
    ob_flush();
    flush();
}

断点续传支持

实现支持断点续传的下载:

php   实现下载

$range = isset($_SERVER['HTTP_RANGE']) ? $_SERVER['HTTP_RANGE'] : false;
if ($range) {
    list($param, $range) = explode('=', $range);
    if (strtolower(trim($param)) != 'bytes') {
        header('HTTP/1.1 400 Invalid Request');
        exit;
    }
    $range = explode('-', $range);
    $start = intval($range[0]);
    $end = isset($range[1]) ? intval($range[1]) : $total_size - 1;
    header('HTTP/1.1 206 Partial Content');
    header("Content-Range: bytes $start-$end/$total_size");
    header("Content-Length: " . ($end - $start + 1));
    fseek($handle, $start);
} else {
    header("Content-Length: $total_size");
}

标签: php
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php 实现跳转

php 实现跳转

PHP 实现页面跳转的方法 在PHP中,实现页面跳转可以通过多种方式完成,以下是几种常用的方法: 使用header函数 header函数是PHP中最常用的跳转方法,通过发送HTTP头部信息实现跳转。…

php实现评论功能

php实现评论功能

数据库设计 创建评论表(示例结构): CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id`…

php 实现多继承

php 实现多继承

在PHP中,原生不支持多继承,但可以通过以下几种方法模拟实现类似多继承的功能: 使用 trait Trait是PHP 5.4引入的特性,允许在类中复用代码片段,可以视为一种轻量级的继承机制。一个类可…