You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:PHP实现PDF在Windows与移动端浏览器内打开的适配方案

解决PHP输出PDF在移动端浏览器直接下载的问题

你的代码在桌面端正常但移动端触发下载,核心原因是移动端浏览器对inline disposition的解析依赖更完整的响应头,以及部分环境下输出缓冲、文件大小缺失导致的行为差异。以下是修改后的代码,同时修复了安全隐患与错误处理:

<?php
// 安全获取POST参数,避免注入风险
$com_no = filter_input(INPUT_POST, 'comno', FILTER_SANITIZE_STRING);
$date = filter_input(INPUT_POST, 'date', FILTER_SANITIZE_STRING);
$name_of_doc = filter_input(INPUT_POST, 'name_of_doc', FILTER_SANITIZE_STRING);

$file = $com_no . '.pdf';
$filename = $date . '_' . $name_of_doc . '.pdf';

// 检查文件是否存在且可读
if (!file_exists($file) || !is_readable($file)) {
    header("HTTP/1.0 404 Not Found");
    exit("文件不存在或无法读取");
}

// 清空输出缓冲区,避免之前的输出干扰头信息
ob_clean();
flush();

// 设置完整的响应头
header('Content-Type: application/pdf');
// 明确指定inline,同时用正确的引号包裹文件名
header('Content-Disposition: inline; filename="' . addslashes($filename) . '"');
header('Content-Transfer-Encoding: binary');
// 添加文件大小头,帮助移动端浏览器判断处理方式
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');
// 禁用缓存,避免浏览器复用旧响应
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

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

关键修改说明:

  • 输入安全过滤:用filter_input替代直接取$_POST,防止XSS或路径注入风险。
  • 文件存在性检查:避免readfile失败时返回空白内容,同时返回404状态码。
  • 清空输出缓冲区:ob_clean()和flush()确保没有之前的空格、BOM或其他输出干扰响应头,这是很多移动端解析异常的常见原因。
  • 添加Content-Length:移动端浏览器依赖这个头判断文件大小,决定是内嵌打开还是触发下载。
  • 完善缓存控制头:防止浏览器缓存旧的响应内容,确保每次请求都获取最新文件。
  • 正确转义文件名:用addslashes处理文件名中的特殊字符,避免Content-Disposition头解析错误。

如果修改后移动端仍有问题,可以尝试:

  • 确保移动端浏览器支持PDF内嵌查看(部分轻量浏览器可能不支持,需调用系统默认PDF阅读器)。
  • 针对含中文的文件名,改用UTF-8编码的文件名格式:
    header('Content-Disposition: inline; filename*=UTF-8\'\'' . rawurlencode($filename));
    

内容的提问来源于stack exchange,提问作者CPY Business Centre 澤昇商務中心

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:10:24