当前位置:首页 > PHP

php实现下载

2026-04-02 21:10:32PHP

PHP实现文件下载的方法

使用PHP实现文件下载功能可以通过多种方式完成,以下是几种常见的方法:

使用header()函数强制下载

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

php实现下载

$file = 'path/to/file.pdf';
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}

使用readfile()函数

readfile()函数可以高效地读取文件内容并输出到浏览器。

$filename = 'example.zip';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
readfile($filename);

处理大文件下载

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

php实现下载

$file = 'large_file.iso';
$chunk_size = 1024*1024; // 1MB chunks

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

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

安全下载注意事项

确保文件路径安全,防止目录遍历攻击。

$requested_file = basename($_GET['file']);
$file_path = 'downloads/' . $requested_file;

if (!file_exists($file_path)) {
    die('File not found');
}

// 验证文件类型
$allowed_types = ['pdf', 'zip', 'doc'];
$ext = pathinfo($file_path, PATHINFO_EXTENSION);
if (!in_array($ext, $allowed_types)) {
    die('Invalid file type');
}

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

进度显示下载

对于超大文件,可以添加下载进度显示。

function output_file($file) {
    if (!file_exists($file)) return false;

    $size = filesize($file);
    $name = basename($file);

    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$name");
    header("Content-Length: $size");

    $fp = fopen($file, "rb");
    $sent = 0;

    while ($sent < $size) {
        $buffer = fread($fp, 4096);
        echo $buffer;
        $sent += strlen($buffer);
        flush();
        // 可以在这里添加进度计算逻辑
    }
    fclose($fp);
    return true;
}

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

标签: php
分享给朋友:

相关文章

php实现文件的下载

php实现文件的下载

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

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现评论功能

php实现评论功能

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

php实现扫码登录

php实现扫码登录

PHP 实现扫码登录的方案 扫码登录通常基于以下流程:用户访问网页生成二维码(含唯一标识),手机扫码后确认登录,服务器验证并完成登录状态同步。以下是具体实现方法: 生成二维码与唯一标识 使用 PHP…

php实现单一入口

php实现单一入口

PHP 单一入口实现方法 单一入口(Single Entry Point)是一种设计模式,通过一个入口文件(如index.php)集中处理所有请求,实现路由分发、统一初始化等操作。以下是实现方法:…

php 实现扫码登录

php 实现扫码登录

PHP 实现扫码登录的流程 扫码登录的核心流程分为两部分:前端生成二维码并轮询状态,后端验证扫码状态并返回登录凭证。以下是具体实现方法: 生成唯一二维码 创建临时令牌 在用户访问登录页面时,后端生…