当前位置: 首页> 最新文章列表> PHP 中如何使用 fpassthru 实现文件流传输

PHP 中如何使用 fpassthru 实现文件流传输

gitbox 2025-05-28

在 PHP 中,fpassthru 函数是一个非常实用的文件流传输工具,尤其适用于直接向客户端输出文件内容,比如图片、视频、下载文件等。它的最大优势是可以高效地将文件内容传输给浏览器,而不需要将整个文件读入内存,从而节省资源,避免内存溢出的问题。

本文将详细介绍如何使用 fpassthru 函数实现文件流传输,并结合一个完整的示例代码,帮助你快速上手。


什么是 fpassthru?

fpassthru 是 PHP 文件操作中的一个函数,功能是从当前文件指针位置一直输出到文件结束。它常与 fopen 配合使用,打开文件后,将文件内容直接输出到浏览器。

函数原型:

int fpassthru ( resource $handle )
  • $handle 是由 fopen() 返回的文件指针资源。

  • 返回值是输出的字节数。


使用场景

  • 文件下载接口

  • 图片或视频流的输出

  • 任何需要将文件原封不动发送到客户端的场景


使用 fpassthru 实现文件流传输的步骤

  1. 打开文件
    使用 fopen() 以二进制模式打开文件,保证传输的文件不受字符编码影响。

  2. 发送正确的 HTTP 头
    根据文件类型发送相应的 Content-TypeContent-LengthContent-Disposition(如果是下载文件)。

  3. 调用 fpassthru 输出文件流
    将文件内容直接输出到客户端。

  4. 关闭文件资源
    释放资源,避免资源泄漏。


完整示例代码

<?php
// 文件路径
$filePath = '/path/to/your/file.zip';

// 判断文件是否存在
if (!file_exists($filePath)) {
    header("HTTP/1.1 404 Not Found");
    exit("File not found.");
}

// 打开文件
$fp = fopen($filePath, 'rb');
if (!$fp) {
    header("HTTP/1.1 500 Internal Server Error");
    exit("Failed to open file.");
}

// 获取文件大小
$fileSize = filesize($filePath);

// 设置 HTTP 头,告诉浏览器文件类型和大小
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
header('Content-Length: ' . $fileSize);
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Expires: 0');

// 使用 fpassthru 输出文件内容
fpassthru($fp);

// 关闭文件资源
fclose($fp);
exit;
?>

代码说明

  • fopen($filePath, 'rb'):以二进制只读模式打开文件。

  • 设置的 HTTP 头确保浏览器识别文件类型和大小,Content-Disposition 指定了下载文件的默认名称。

  • fpassthru($fp) 会直接将文件指针当前位置到文件末尾的所有数据输出。

  • 关闭文件句柄后退出,确保不会输出多余内容。


注意事项

  • 如果文件较大,fpassthru 是高效的传输方式,因为它不会将文件全部读入内存。

  • 传输之前务必发送合适的 HTTP 头,确保浏览器正确处理文件。

  • 若文件路径来自用户输入,务必做好安全校验,防止路径穿越等安全风险。

  • 对于支持断点续传的下载需求,需要额外处理 HTTP_RANGE 头,本文不做详细讲解。


小结

通过以上步骤,你可以轻松使用 PHP 的 fpassthru 函数实现高效的文件流传输。它适合各类文件下载和流媒体输出场景,且代码简洁、性能优秀。

如果你需要搭建文件下载接口或者媒体流服务,不妨试试 fpassthru,它会让你的代码更简洁高效。