1

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

$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 找到原因:

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

4

1 回答 1

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;
于 2013-07-15T09:09:55.263 回答