当前位置:首页 > PHP

php怎么实现下载文件

2026-04-03 06:00:38PHP

PHP实现文件下载的方法

使用PHP实现文件下载功能可以通过设置HTTP头信息强制浏览器下载文件而不是直接打开。以下是几种常见方法:

使用header()函数实现基本下载

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

if(file_exists($file_path)) {
    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));
    flush();
    readfile($file_path);
    exit;
} else {
    die('文件不存在');
}

处理大文件下载

对于大文件,可以分块读取避免内存问题:

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

if(file_exists($file_path)) {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file_path).'"');

    $file = fopen($file_path, 'rb');
    while(!feof($file)) {
        print fread($file, $chunk_size);
        flush();
    }
    fclose($file);
} else {
    http_response_code(404);
    die('文件不存在');
}

安全下载实现

增加安全检查防止目录遍历攻击:

$base_dir = '/secure/downloads/';
$requested_file = $_GET['file'] ?? '';
$file_path = realpath($base_dir . $requested_file);

// 检查文件是否在允许目录内
if($file_path && strpos($file_path, realpath($base_dir)) === 0 && is_file($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);
} else {
    http_response_code(403);
    die('禁止访问');
}

强制下载特定MIME类型

针对特定文件类型强制下载:

php怎么实现下载文件

$file_path = '/path/to/image.png';
$mime_types = [
    'png'  => 'image/png',
    'jpeg' => 'image/jpeg',
    'jpg'  => 'image/jpeg',
    'gif'  => 'image/gif'
];

$ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
if(isset($mime_types[$ext])) {
    header('Content-Type: '.$mime_types[$ext]);
    header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
    readfile($file_path);
}

注意事项

  • 确保脚本有权限读取目标文件
  • 对大文件使用分块读取方式
  • 验证用户输入防止路径遍历攻击
  • 考虑添加下载限速功能防止服务器过载
  • 可以记录下载日志用于统计

这些方法可以根据实际需求组合使用,实现安全可靠的文件下载功能。

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

相关文章

php实现mysql

php实现mysql

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

php实现一个

php实现一个

PHP 实现一个简单的计算器 创建一个基本的计算器,支持加、减、乘、除运算。以下是一个完整的实现代码示例: <?php $result = ""; if ($_SERVER["REQUEST_…

php实现统计

php实现统计

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

php 实现面包屑导航

php 实现面包屑导航

实现面包屑导航的方法 面包屑导航(Breadcrumb Navigation)是一种常见的网站导航方式,用于显示用户当前页面的路径。以下是几种在 PHP 中实现面包屑导航的方法。 基于 URL 路径…

php 实现排名

php 实现排名

PHP 实现排名的方法 在 PHP 中实现排名功能通常涉及对数据进行排序、计算排名以及输出结果。以下是几种常见的实现方式: 基本数组排序排名 $scores = [85, 92, 78, 95, 8…

php实现抽奖程序

php实现抽奖程序

PHP实现抽奖程序 基本抽奖逻辑 创建一个简单的抽奖程序需要定义奖品、中奖概率及随机选择逻辑。以下是一个基础实现示例: <?php // 奖品配置(奖品名称 => 概率) $prizes…