web-dev-qa-db-ja.com

添付ファイルのファイル名をサニタイズする

ユーザーがアップロードした添付ファイルのファイル名をサニタイズする方法を探しています。

私はwordpressがすでにそれをしていると思ったが、私はユーザーが「°」を含む添付ファイルをアップロードした後に問題に直面しました。そのように添付ファイルはダウンロードできません。

私はこのwp関数を見つけました:

sanitize_file_name($filename)

内部でそれを使用する方法はありますか

add_attachment

アクション?

ありがとう

2
Dalen

私のプラグイン Germanix URL でそれをどのようにしたか見てください。私は'sanitize_file_name'にフックし、必要なものを変換し、それ以外のものを取り除きます。このようにして、ファイルは通過しますが、ファイル名は有効です。

私はこれが可能な限り最高のユーザーエクスペリエンスだと思います。データが失われたり、時間がなくなったり、不快なエラーメッセージが表示されることはありません。

2
fuxia

質問のコメントから続く

sanitize_file_name_charsにフィルタをかけて無効な文字の配列に学位記号を追加することはできますが、アップロードが中断されることはなく、単にファイル拡張子が削除されます。

ただし、上記のフィルタの直後に追加されるsanitize_file_nameフィルタを追加することで、ちょっとした方法でアップロードを停止する別のフィルタを追加できます。ファイル拡張子が存在するかどうかがわかります。無効なchars配列を使用すると、フィルタ内でdie()を使用することができます。これにより、アップロードプロセスがHTTPエラーを返すようになります(これは単に黙って死ぬほうが良いでしょう)。

add_filter( 'sanitize_file_name_chars', 'restrict_filename_chars' );

function restrict_filename_chars( $special_chars ) {
    $special_chars = array_merge( array( '°' ), $special_chars );
    return $special_chars;
}

add_filter( 'sanitize_file_name', 'die_on_no_ext' );

function die_on_no_ext( $filename ) {
    global $parts;
    if( $parts < 2 )
        die(-1);
    return $filename;
}

これは理想的な解決策ではありません。チケットで何が起こるかがわかります(私は何かが足りない可能性があります。ファイル検証の専門家ではありません)。

注:フィルタは実際のファイル名が学位記号を含まず、「投稿名」(つまり添付ファイルのタイトル)を含まないようにするだけです。添付ファイルのタイトルのサニタイズを処理するには別のフィルタが必要です。これはさまざまな関数やフィルタによって処理されるためです。

2
t31os