如何从数据库下载BLOB类型的PDF文件,避免默认保存为.php格式
问题解决方法
你遇到的下载默认后缀为.php的问题,核心原因是没有显式给浏览器指定下载文件名,浏览器默认会将当前执行的PHP脚本名作为保存文件名。
只需要在输出Content-Type头之后,新增Content-Disposition响应头即可,该头可以指定文件保存时的默认名称,还可以控制是直接在浏览器内预览文件还是直接触发下载操作:
- 如果需要保留当前浏览器直接预览PDF的效果,仅修改下载时的默认文件名,使用
inline参数 - 如果需要用户访问后直接触发PDF文件下载,不直接在浏览器内预览,使用
attachment参数
修改后的代码参考:
if(isset($_POST['submit'])){ $docno = $_POST['docno']; $admno = $_POST['admno']; $sql = "SELECT * FROM bonafide_cert WHERE DocumentNumber=:docno AND AdmssnNo=:admno"; $query = $dbh->prepare($sql); $query->bindParam(':admno',$admno,PDO::PARAM_STR); $query->bindParam(':docno',$docno,PDO::PARAM_STR); $query->execute(); $results=$query->fetchAll(PDO::FETCH_OBJ); if($query->rowCount() > 0) { foreach($results as $result) { header('Content-Type:'.$result->mime); // 新增Content-Disposition头,filename后为默认保存的文件名,可按需求自定义命名规则 header('Content-Disposition: inline; filename="证明文件_'.$docno.'.pdf"'); // 可选补充:添加Content-Length头,让浏览器可以正常显示下载进度 header('Content-Length: ' . strlen($result->pdf_file)); echo $result->pdf_file; // 输出完成后直接退出,避免后续多余内容破坏PDF文件结构 exit; } } }
注意事项
- 文件名如果包含中文,需要先做编码处理避免乱码,示例:
$filename = rawurlencode('证明文件_'.$docno.'.pdf'); header('Content-Disposition: inline; filename*=UTF-8\'\''.$filename); - 输出PDF内容前确保没有任何额外输出(比如PHP文件开头的空格、BOM头、其他echo调试内容等),否则会导致PDF文件损坏无法打开。
- 若查询返回多条结果,上述代码中的
exit会仅输出第一份PDF,如有多文件下载需求可自行调整逻辑,一般该场景单条查询返回单份PDF即可满足需求。
内容的提问来源于stack exchange,提问作者Aswin Haridas
相关产品推荐
相关产品推荐

