php下载文件源代码(强制任意文件格式下载)

要实现 PHP 下载文件的功能,有两种常见的方式:

要实现 PHP 下载文件的功能,有两种常见的方式:

  1. 通过设置 HTTP 响应头,让浏览器以下载文件的方式处理页面输出。
  2. 读取服务器端的文件内容,设置 HTTP 响应头,并输出文件内容。

下面是分别对应两种方式的完整攻略:

通过设置 HTTP 响应头

代码示例:

$file = 'example.png'; // 要下载的文件路径
$filename = 'newname.png'; // 下载时的文件名

// 清除缓冲区
ob_clean();

// 设置 HTTP 响应头
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($filename));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($file));

// 输出文件内容
readfile($file);

该示例中,我们通过设置 HTTP 响应头的方式告诉浏览器这个页面是一个下载文件,并指定了下载时的文件名、文件类型等相关信息,然后输出文件内容。

读取服务器端的文件内容

代码示例:

$file = 'example.pdf'; // 要下载的文件路径
$filename = 'newname.pdf'; // 下载时的文件名

// 打开文件,并读取内容
if ($handle = fopen($file, 'rb')) {
    $contents = fread($handle, filesize($file));
    fclose($handle);
}

// 设置 HTTP 响应头
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);

// 输出文件内容
echo $contents;

该示例中,我们直接读取了服务器端的文件内容,然后设置了下载时的文件名和文件类型的 HTTP 响应头,并将文件内容输出给浏览器。

需要注意的是,上述方式在处理大文件时可能会出现性能问题。在实际开发中,如果需要下载大型文件,可以考虑使用分块传输方式,以避免服务器压力过大,同时提高下载速度。

例如:

$file = 'example.mp4'; // 要下载的文件路径
$filename = 'newname.mp4'; // 下载时的文件名
$chunksize = 1 * 1024 * 1024; // 每块大小,这里设置为 1MB

// 打开文件
if ($handle = fopen($file, 'rb')) {
    // 计算文件大小和块数
    $filesize = filesize($file);
    $totalchunks = ceil($filesize / $chunksize);

    // 设置 HTTP 响应头
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$filename);

    // 逐块输出文件内容
    for ($i=0; $i<$totalchunks; $i++) {
        $start = $i * $chunksize;
        $end = $start + $chunksize - 1;
        if ($end > $filesize) {
            $end = $filesize - 1;
        }
        // 输出数据块
        fseek($handle, $start);
        echo fread($handle, $end - $start + 1);
        // 清空缓冲区,避免内存占用过大
        ob_flush();
        flush();
    }
    fclose($handle);
}

该示例中,我们通过分块逐个输出文件内容的方式减轻了服务器压力,保证了下载速度。

本文标题为:php下载文件源代码(强制任意文件格式下载)

基础教程推荐