当前位置:首页 > 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 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HT…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…