我有以下问题:当我尝试保存名称中包含分号的文件时,它会返回页面上字符的巨大且奇怪的堆栈跟踪。我试图逃避,修剪和替换那些分号,但结果仍然是相同的。我使用以下正则表达式:
$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参数函数将分号计为分隔符!有没有办法在文件头中转义它?
答案 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;