当前位置:首页 > PHP

php怎么实现下载文件

2026-02-27 21:16:59PHP

实现文件下载的基本方法

在PHP中实现文件下载可以通过设置HTTP头信息强制浏览器下载文件而非直接显示。以下是基本实现方式:

$file_path = '/path/to/your/file.ext';
$file_name = 'download_name.ext';

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));
    readfile($file_path);
    exit;
}

处理大文件下载

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

php怎么实现下载文件

$chunk_size = 1024 * 1024; // 1MB chunks
$handle = fopen($file_path, 'rb');
while(!feof($handle)){
    $buffer = fread($handle, $chunk_size);
    echo $buffer;
    ob_flush();
    flush();
}
fclose($handle);

安全下载实现

为防止目录遍历攻击,应对文件路径进行验证:

php怎么实现下载文件

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

if($real_path && strpos($real_path, $base_dir) === 0 && is_file($real_path)){
    // 安全下载代码
} else {
    die('Invalid file');
}

断点续传支持

实现断点续传需要处理HTTP_RANGE头:

$size = filesize($file_path);
$start = 0;
$end = $size - 1;

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

    header('HTTP/1.1 206 Partial Content');
    header('Content-Range: bytes '.$start.'-'.$end.'/'.$size);
} else {
    header('HTTP/1.1 200 OK');
}

header('Accept-Ranges: bytes');
header('Content-Length: '.($end - $start + 1));

常见MIME类型设置

根据文件类型设置正确的Content-Type:

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

$ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));
if(array_key_exists($ext, $mime_types)){
    header('Content-Type: '.$mime_types[$ext]);
} else {
    header('Content-Type: application/octet-stream');
}

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

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (H…

vue实现文件预览展示

vue实现文件预览展示

Vue 实现文件预览展示的方法 使用第三方库预览常见文件类型 对于常见的文件类型(如 PDF、图片、视频等),可以使用现成的 Vue 组件库来实现预览功能。 PDF 预览:使用 vue-pdf 或…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

java如何读取文件

java如何读取文件

读取文件的常用方法 Java提供了多种读取文件的方式,适用于不同场景和需求。以下是几种常见的方法: 使用FileInputStream和BufferedInputStream读取二进制文件 t…