如何通过view.php显示MySQL中以longblob格式存储的PDF文件
现有代码核心问题
- 前端跳转
view.php时没有传递学生唯一标识、要查询的PDF字段名,后端无法定位到对应记录的blob数据 view.php仅设置了响应头,完全没有编写从MySQL查询对应longblob数据并输出的逻辑,浏览器拿到的是空内容,自然无法解析PDF- 缺少
Content-Disposition、Content-Length等必要头字段,浏览器无法正常识别文件加载规则
修正后的代码
前端表格代码
<td><?php echo $row["Stud_ID"]; ?></td> <td><?php echo $row["Course"]; ?></td> <td><?php echo $row["Lastname"]; ?></td> <td><?php echo $row["Firstname"]; ?></td> <!-- 跳转时传递学生ID和要查看的PDF字段名 --> <td><a href="view.php?stud_id=<?php echo $row['Stud_ID']; ?>&field=PSA" target="_blank"><?php echo $row["PSA"]; ?></a></td> <td><?php echo $row["Form137"]; ?></td> <td><?php echo $row["Picture"]; ?></td>
view.php代码
<?php // 1. 接收并校验参数,防止SQL注入 $stud_id = intval($_GET['stud_id']); $allow_fields = ['PSA', 'Form137']; // 允许查询的PDF字段白名单 $field = in_array($_GET['field'], $allow_fields) ? $_GET['field'] : 'PSA'; // 2. 连接MySQL(请替换为你自己的数据库连接配置) $conn = mysqli_connect('数据库地址', '用户名', '密码', '数据库名'); if (!$conn) { die('数据库连接失败'); } // 3. 查询对应记录的blob数据 $sql = sprintf("SELECT `%s` FROM 学生表名 WHERE Stud_ID = %d", $field, $stud_id); $res = mysqli_query($conn, $sql); $row = mysqli_fetch_assoc($res); $pdf_content = $row[$field]; // 4. 输出响应头和PDF内容,注意header前不能有任何输出(包括空格、换行) header('Content-Type: application/pdf'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Content-Length: ' . strlen($pdf_content)); // 如果需要强制下载而不是在线预览,把下面这行注释打开 // header('Content-Disposition: attachment; filename="'.$stud_id.'_'.$field.'.pdf"'); // 直接输出PDF二进制内容,不要输出任何其他内容 echo $pdf_content; // 结束后立刻终止程序,避免后续额外输出污染PDF exit; ?>
注意事项
view.php的PHP开始标签<?php前面不能有任何空格、换行、HTML内容,结束标签?>后面也不能有任何多余字符,否则会破坏PDF的二进制结构导致无法打开- 如果存储PDF到数据库时做过base64编码,输出前需要先调用
base64_decode()解码 - 请将代码中的数据库地址、用户名、密码、数据库名、学生表名替换为你自己的实际配置
内容的提问来源于stack exchange,提问作者AlksAndTrsh
相关产品推荐
相关产品推荐

