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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:35:21