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 は、docx のような圧縮された ZIP 形式のファイルであることを意味します。

1 つの推測: は宛先のファイル名に有効な文字ではありませんか?

あなたの正規表現は良くありません: (ドットだけはどの文字にも適用できます...)

$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 に答える