当前位置:首页 > PHP

php 实现下载

2026-01-14 12:52:17PHP

PHP 实现文件下载的方法

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

基本下载实现

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

if (file_exists($file_path)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . $file_name . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file_path));
    readfile($file_path);
    exit;
} else {
    echo '文件不存在';
}

大文件分块下载

对于大文件,可以使用分块下载方式减少内存消耗:

php 实现下载

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

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

强制下载特定 MIME 类型

可以指定特定的 MIME 类型强制浏览器下载:

php 实现下载

$mime_types = [
    'pdf' => 'application/pdf',
    'txt' => 'text/plain',
    'jpg' => 'image/jpeg'
];

$ext = pathinfo($file_path, PATHINFO_EXTENSION);
if (isset($mime_types[$ext])) {
    header('Content-Type: ' . $mime_types[$ext]);
}

安全注意事项

实现下载功能时需注意安全防护:

  • 验证文件路径是否在允许的目录范围内
  • 禁止用户通过路径遍历下载系统文件
  • 对下载文件名进行过滤,防止注入攻击
$base_dir = '/var/www/downloads/';
$requested_file = $_GET['file'];
$real_path = realpath($base_dir . $requested_file);

if (strpos($real_path, $base_dir) === 0 && file_exists($real_path)) {
    // 安全下载逻辑
} else {
    die('非法文件请求');
}

进度显示实现

如需显示下载进度,可通过 JavaScript 配合 PHP 实现:

// 前端代码示例
fetch('/download.php')
  .then(response => {
    const reader = response.body.getReader();
    const contentLength = +response.headers.get('Content-Length');
    let received = 0;

    return new ReadableStream({
      start(controller) {
        function push() {
          reader.read().then(({done, value}) => {
            if (done) {
              controller.close();
              return;
            }
            received += value.length;
            updateProgress(received / contentLength);
            controller.enqueue(value);
            push();
          });
        }
        push();
      }
    });
  });

标签: php
分享给朋友:

相关文章

php实现聊天

php实现聊天

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

php 实现面包屑导航

php 实现面包屑导航

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

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…

php session实现购物车

php session实现购物车

PHP Session 实现购物车 初始化 Session 确保在使用 Session 前调用 session_start() 函数。通常放在 PHP 文件的最顶部。 <?php sessio…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (flock…