📜  如何强制在PHP中下载文件?(1)

📅  最后修改于: 2023-12-03 15:38:46.749000             🧑  作者: Mango

如何强制在PHP中下载文件

在PHP中,可以使用header()函数来设置响应头信息,从而控制浏览器的行为,实现强制下载文件的功能。

代码实现

以下是示例代码,可以根据实际需要进行修改:

// 文件路径
$file_path = '/path/to/file';

// 文件名
$file_name = 'example.txt';

// 下载文件
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file_name . '"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
header('Content-Length: ' . filesize($file_path));

// 输出文件内容
readfile($file_path);
解释说明
  • Content-Type:表示返回的文件类型,该值设置为application/octet-stream表示二进制流文件类型,通常用于未知文件类型的下载;
  • Content-Disposition:表示用户收到的文件的名称,以及如何显示该文件;
  • Content-Transfer-Encoding:表示文件传输的编码格式,通常使用binary
  • Accept-Ranges:表示服务器是否支持文件的断点续传,该值通常设置为bytes
  • Cache-ControlPragmaExpires:这些响应头用于禁止浏览器缓存文件;
  • Content-Length:表示返回文件的长度,通常使用filesize()函数获取。

在下载文件之前,必须确保需要下载的文件存在并可读。可以使用file_exists()is_readable()函数来验证文件是否存在并可读。

注意事项
  • 在输出文件内容之前,不能输出其他内容(例如文本、HTML标记等),否则将导致下载文件的失败;
  • 在PHP 7.2.0及以上版本中,如果文件大小超过了2GB,必须使用sprintf('%.0f', filesize($file_path))来代替filesize($file_path),否则将导致文件大小计算错误;
参考链接