当前位置: 首页> 最新文章列表> 下载文件时使用 Content-Disposition 设置下载文件名

下载文件时使用 Content-Disposition 设置下载文件名

M66 2025-05-28

在很多网站开发中,用户可能需要下载文件。使用 PHP 提供的 header 函数,可以方便地设置 HTTP 响应头,控制文件的下载行为。在这个教程中,我们将介绍如何使用 PHP 的 header 函数设置 Content-Disposition 来指定下载文件的文件名。

1. 什么是 Content-Disposition

Content-Disposition 是一个 HTTP 头,它告知浏览器如何处理文件。最常见的用法是在浏览器中启动文件下载,并为下载的文件指定一个文件名。它通常与 Content-Type 一起使用,后者告诉浏览器如何解释文件的内容类型。

2. 如何使用 header 函数设置 Content-Disposition

header 函数可以用来发送原始 HTTP 头。如果我们想指定文件下载时的文件名,我们可以设置 Content-Disposition 头。下面是一个简单的例子:

<?php
// 设置文件路径
$file = 'path/to/your/file.txt';

// 确保文件存在
if (file_exists($file)) {
    // 设置正确的内容类型,告诉浏览器这是一个下载文件
    header('Content-Type: application/octet-stream');
    
    // 设置 Content-Disposition 头,指定文件下载时的文件名
    header('Content-Disposition: attachment; filename="downloaded_file.txt"');
    
    // 设置文件大小
    header('Content-Length: ' . filesize($file));
    
    // 读取并输出文件内容
    readfile($file);
    exit;
} else {
    echo "文件不存在!";
}
?>

3. 代码说明

  • header('Content-Type: application/octet-stream');:这行代码告诉浏览器下载的是二进制文件,不进行自动打开。

  • header('Content-Disposition: attachment; filename="downloaded_file.txt"');:这行代码指定了文件的下载方式为 attachment(即下载),并且给文件指定了下载后的名称 "downloaded_file.txt"

  • header('Content-Length: ' . filesize($file));:这行代码指定了文件的大小,有助于浏览器正确处理文件的下载。

  • readfile($file);:此函数会读取文件并将内容发送到浏览器,从而开始文件下载。

4. 如何使用动态生成的文件名?

有时候,我们可能希望文件名是动态生成的,而不仅仅是一个固定的字符串。在这种情况下,可以通过 PHP 变量来设置文件名。例如:

<?php
// 设置文件路径
$file = 'path/to/your/file.txt';

// 动态生成文件名
$fileName = 'downloaded_' . date('Y-m-d_H-i-s') . '.txt';

// 确保文件存在
if (file_exists($file)) {
    // 设置正确的内容类型
    header('Content-Type: application/octet-stream');
    
    // 动态设置 Content-Disposition 头
    header('Content-Disposition: attachment; filename="' . $fileName . '"');
    
    // 设置文件大小
    header('Content-Length: ' . filesize($file));
    
    // 读取并输出文件内容
    readfile($file);
    exit;
} else {
    echo "文件不存在!";
}
?>

在这个例子中,文件名将包含当前的日期和时间(如:downloaded_2025-05-04_12-30-45.txt),每次下载时文件名都会不同。

5. 如何处理 URL 下载?

有时候,我们需要通过 URL 提供文件下载,而不仅仅是服务器上的本地文件。这时,我们也可以用 header 函数来设置 Content-Disposition,并将文件内容从远程服务器下载过来。

<?php
// 设置远程文件 URL
$url = 'https://m66.net/files/sample.txt';

// 获取文件内容
$fileContent = file_get_contents($url);

// 如果文件内容获取成功
if ($fileContent !== false) {
    // 设置文件类型
    header('Content-Type: application/octet-stream');
    
    // 设置文件下载名称
    header('Content-Disposition: attachment; filename="sample_from_m66.txt"');
    
    // 设置文件大小
    header('Content-Length: ' . strlen($fileContent));
    
    // 输出文件内容
    echo $fileContent;
    exit;
} else {
    echo "无法下载文件!";
}
?>

在这个例子中,我们从 https://m66.net/files/sample.txt 下载文件,并通过 header 设置下载文件的名称为 sample_from_m66.txt

6. 注意事项

  • 在发送任何 header 之前,确保没有任何 HTML 输出。因为 HTTP 头必须在任何内容输出之前发送。

  • 如果文件很大,考虑使用流式读取文件内容,而不是将整个文件加载到内存中。

总结

通过 PHP 的 header 函数,我们可以很容易地控制文件的下载行为,包括设置文件下载时的文件名。在实际开发中,这种功能非常常见,尤其是在文件管理系统、报表生成等应用中。