当前位置:首页 > PHP

php如何实现下载功能

2026-04-03 03:18:51PHP

PHP 实现文件下载功能

使用 header() 函数强制下载

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

$file = 'path/to/your/file.pdf'; // 文件路径
$filename = 'custom_name.pdf';   // 下载时显示的文件名

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

动态生成内容并下载

适用于需要动态生成内容(如 CSV、文本)的场景。

$content = "姓名,年龄,性别\n张三,25,男\n李四,30,女";
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="data.csv"');
echo $content;
exit;

大文件分块下载

处理大文件时避免内存溢出,使用分块读取。

$file = 'large_file.zip';
$chunk_size = 1024 * 1024; // 1MB 分块

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    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);
    exit;
}

安全注意事项

  • 验证文件路径,防止目录遍历攻击:

    $base_dir = '/safe/directory/';
    $requested_file = $_GET['file'];
    $real_path = realpath($base_dir . $requested_file);
    
    if (strpos($real_path, $base_dir) === 0 && file_exists($real_path)) {
        // 安全下载逻辑
    }
  • 限制文件类型(如仅允许下载 .pdf.csv)。

进阶:断点续传

支持 HTTP 范围请求(Range),实现断点续传功能:

php如何实现下载功能

$file = 'large_video.mp4';
$size = filesize($file);
$fp = fopen($file, 'rb');

header('Accept-Ranges: bytes');
if (isset($_SERVER['HTTP_RANGE'])) {
    $range = $_SERVER['HTTP_RANGE'];
    list($start, $end) = explode('-', substr($range, 6));
    $start = max(0, intval($start));
    $end = min($size - 1, $end ? intval($end) : $size - 1);
    header('HTTP/1.1 206 Partial Content');
    header("Content-Range: bytes $start-$end/$size");
    header("Content-Length: " . ($end - $start + 1));
    fseek($fp, $start);
    echo fread($fp, $end - $start + 1);
} else {
    header('Content-Length: ' . $size);
    readfile($file);
}
fclose($fp);

分享给朋友:

相关文章

vue如何实现

vue如何实现

Vue 实现方法 Vue 提供了多种方式来实现功能,具体取决于需求。以下是一些常见场景的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。在组件中可以通过 pro…

vue实现tab功能

vue实现tab功能

Vue实现Tab功能的方法 使用动态组件和v-for指令 在Vue中实现Tab功能可以通过动态组件和v-for指令结合完成。定义一个包含tab标题和对应内容的数组,使用v-for渲染tab标题,并通过…

php实现评论功能

php实现评论功能

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

java是如何实现跨平台的

java是如何实现跨平台的

Java 跨平台的实现原理 Java 实现跨平台的核心机制基于 “一次编写,到处运行” 的理念,主要通过以下技术实现: 字节码与 JVM Java 源代码编译后生成字节码(.class 文件),而非…

h5实现手机摇一摇功能

h5实现手机摇一摇功能

实现原理 手机摇一摇功能基于设备加速度传感器(DeviceMotionEvent),通过监听设备的加速度变化来判断用户是否进行了摇晃动作。HTML5提供了相关API获取设备传感器数据。 基本…

vue如何实现404

vue如何实现404

实现 Vue 404 页面的方法 在 Vue 中实现 404 页面通常需要结合路由配置和动态路由匹配。以下是几种常见方法: 使用通配符路由匹配 在 Vue Router 配置中,可以通过 * 通配符…