Perl写入文件返回巨大的怪异堆栈跟踪

时间:2013-07-15 08:11:17

标签: perl file io cgi

我有以下问题:当我尝试保存名称中包含分号的文件时,它会返回页面上字符的巨大且奇怪的堆栈跟踪。我试图逃避,修剪和替换那些分号,但结果仍然是相同的。我使用以下正则表达式:

$value =~ s/([^a-zA-Z0-9_\-.]|;)/uc sprintf("%%%02x",ord($1))/eg;

(我甚至分别添加了|;部分。)

所以,当我打开文件来编写并调用print函数时,它会返回许多奇怪的东西,比如:

PK!}�3y�[Content_Types].xml ���/�h9\�?�0���cz��:� �s_����o���>�T��(这是一个巨大的,这只是它的一部分)。

有什么方法可以避免这种情况吗?

提前谢谢!

编辑:

只是感兴趣 - 这个字符串中PK的责任是什么?我的意思是我可以理解那些字符只是文件的内容,但是PK是什么?为什么它会显示内容类型?

编辑2.0:

我正在上传.docx文件 - 当名称不包含分号时,它可以正常工作。这是文件保存的代码:

open (QSTR,">", "$dest_file") or die "can't open output file: $qstring_file";
print QSTR $value;
close (QSTR);

编辑3.0

这是一个.cgi脚本,在将一些数据发布到服务器后调用。它必须以键值对的方式将有关上载文件的一些信息保存到临时文件(名称,内容,大小)。因此任何包含分号的文件都会导致此错误。

编辑4.0 找到了原因:

上传params时CGI参数函数将分号计为分隔符!有没有办法在文件头中转义它?

1 个答案:

答案 0 :(得分:1)

文件头中的PK意味着它像文件一样压缩ZIP,如docx。

一个猜测:在目的地的文件名中无效字符?

你的正则表达式并不好:(单独的点适用于任何角色......)

$value =~ s/([^a-zA-Z0-9_\-.]|;)/uc sprintf("%%%02x",ord($1))/eg;

试试这个:

#replace evey non valid char to underscore
$value =~ s/([^a-zA-Z0-9_\-\.\;])/_/g;