当前位置:首页 > PHP

php实现文件下载

2026-04-02 19:12:10PHP

实现文件下载的基本方法

使用PHP实现文件下载可以通过设置HTTP头信息,强制浏览器下载文件而不是直接打开。

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

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

处理大文件下载

对于大文件下载,可以使用分块读取的方式避免内存问题。

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

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

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

增加安全措施

为了防止目录遍历攻击,需要对文件路径进行验证。

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

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

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

实现断点续传

支持HTTP Range请求,实现断点续传功能。

$file_path = 'path/to/file.mp4';
$file_size = filesize($file_path);
$file = fopen($file_path, 'rb');

header('Content-Type: video/mp4');
header('Accept-Ranges: bytes');

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

    $start = max(0, intval($start));
    $end = min($file_size - 1, empty($end) ? ($file_size - 1) : intval($end));

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

    fseek($file, $start);
    $remaining = $end - $start + 1;
    while ($remaining > 0) {
        echo fread($file, min(8192, $remaining));
        $remaining -= 8192;
        flush();
    }
} else {
    header('Content-Length: ' . $file_size);
    header('Content-Disposition: attachment; filename="' . basename($file_path) . '"');
    echo fread($file, $file_size);
}

fclose($file);
exit;

添加下载统计功能

记录文件下载次数到数据库。

php实现文件下载

$file_id = $_GET['id'];
$file_path = get_file_path_from_db($file_id);

// 更新下载计数
update_download_count($file_id);

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

这些方法涵盖了从基本文件下载到高级功能的实现,可以根据具体需求选择适合的方案。

标签: 文件php
分享给朋友:

相关文章

vue实现文件模板展示

vue实现文件模板展示

Vue 实现文件模板展示的方法 在 Vue 中实现文件模板展示功能,可以通过多种方式完成。以下是几种常见的实现方法: 使用动态组件 动态组件允许根据条件切换不同的模板组件。通过 :is 属性绑定组…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mod_…