Perl新手求助:浏览器无法正常显示PDF/JPG文件,仅显示纯文本
问题分析与修复方案
核心问题:重复输出HTTP头部
你的脚本头部已经执行了print $q->header;,这会向浏览器发送默认的Content-Type: text/html头部。之后再输出PDF/JPG的Content-Type头部属于重复发送,浏览器会忽略后续头部,仍然按text/html解析二进制内容,最终导致文件显示为乱码文本。
PDF处理代码修复
原代码存在重复输出头部、文件打开方式不够安全的问题,修复后代码如下:
#!/usr/bin/perl use strict; use warnings; use CGI; my $q = CGI->new; # 移除脚本中原先的print $q->header; 直接输出PDF对应的HTTP头部 print $q->header( -type => 'application/pdf', -content_length => -s '<path-to-pdf>' ); # 用3参数+二进制模式打开文件,更安全可靠 open(my $pdf_fh, '<:raw', '<path-to-pdf>') or die "could not open PDF [$!]"; my $output = do { local $/; <$pdf_fh> }; close($pdf_fh); print $output;
说明:
- 使用
<:raw模式打开文件,确保二进制内容无转换读取 - 借助CGI模块的
header方法统一输出头部,避免手动拼接出错 - 用
-s直接获取文件大小,无需读取内容后计算长度
JPG处理代码修复
原代码存在变量重复赋值、输出顺序颠倒、未指定二进制模式的问题,修复后代码如下:
#!/usr/bin/perl use strict; use warnings; use CGI; my $q = CGI->new; my $img_path = '<path-to-img>'; print $q->header( -type => 'image/jpeg', -content_length => -s $img_path ); open(my $img_fh, '<:raw', $img_path) or die "could not open image [$!]"; my $data = do { local $/; <$img_fh> }; close($img_fh); print $data;
说明:
- 调整代码顺序,先读取文件内容再输出,避免输出空数据
- 用
<:raw模式确保图片二进制内容正确读取 - 统一通过CGI模块管理HTTP头部,避免手动拼接错误
通用注意事项
- 脚本不要提前输出默认的
$q->header;,需根据输出内容类型动态生成对应头部 - 处理二进制文件时,必须用二进制模式打开(
<:raw或binmode),防止换行符转换损坏文件 - 优先使用3参数的
open方式(open($fh, 模式, 文件路径)),比老式两参数写法更安全,避免注入风险
内容的提问来源于stack exchange,提问作者mimmone
相关产品推荐
相关产品推荐

