1

私は「ジレンマ」を抱えており、ビジネスのベストプラクティスとは何か疑問に思っています。

Uploadifyを使用して画像をアップロードしています。次に、ファイルを保存する前にファイル名を検証する必要があります。

私はさまざまな解決策を見てきましたが、1つの良い解決策にたどり着くことができません。

これが私の基準です:

  • ファイル名はすべて小文字である必要があります
  • ファイル名には文字[a-z0-9_-]のみを含めることができます
  • ファイルの名前を変更できる必要があります

ファイル名がである場合、どうしますmy.file(name).jpegか?

'。'のファイル名を分解できます。拡張子を保存してから、ファイル名を再度取得するために内包します。しかし、それが最良の解決策であるかどうかはわかりません。

私は少し役立つ次の関数を持っています:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

更新1
$_FILESを介してファイルを受信して​​います。これにより、次のデータが得られます。

  • $ _FILES ["file"]["name"]-アップロードされたファイルの名前
  • $ _FILES["file"]["type"]-アップロードされたファイルのタイプ
  • $ _FILES ["file"]["size"]-アップロードされたファイルのバイト単位のサイズ
  • $ _FILES["file"]["tmp_name"]-サーバーに保存されているファイルの一時コピーの名前
  • $ _FILES["file"]["error"]-ファイルのアップロードに起因するエラーコード

UPDATE2
何かを見つけました。7つの要素の配列を返すgetimagesizeを使用できます。これらの要素の1つ[2]はIMAGETYPE_XXXです。

だから私はこのコードを使ってみます:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

しかし、それは数2を返すだけです...

(exif_imagetypeも使用しようとしましたが、PHPエラー:未定義関数の呼び出しのみが発生します。)

4

5 に答える 5

4

正規表現でファイル名を確認してください。mimetypeに関する情報を使用します。md5名でサーバーにファイルを保存します。実際のファイル名をdbに保存します。

于 2009-12-08T22:52:20.193 に答える
3

pathinfo()は、ファイル名と拡張子を取得できます。ただし、ファイル名を調べてファイルの拡張子をテストすることに頼ることはできないことを警告します。これについては、ファイルのバイナリコンテンツを実際に検査する関数を使用する必要があります。finfo_file()はこれを実現できます。ああ、パストラバーサル攻撃を防ぐためにユーザー指定のファイルパスでbasename()を使用しても問題はありません。

于 2009-12-08T22:52:52.797 に答える
0

これはあなたが望むすべてをするはずです:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

そして、Pekkaが説明したように、ファイル名のすべてのアクセントを置き換えたい場合は、次の関数を使用できます。

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}
于 2009-12-08T22:55:52.263 に答える
0

後でダウンロードファイル名として使用するためにファイル名を検証していると想定しています。

ユーザーのためにファイル名をそのままにしておくのは素晴らしいことですが、技術的な観点からは、あなたのアプローチは適切に聞こえます。

URLがどのように見えるかを気にし、将来的に海外の視聴者をターゲットにする可能性がある場合は、必ずウムラウトを基本文字に変換するか、変換してください。ドイツのユーザー(UmlautsÄÖÜß)は、変換を期待します。

Ä = ae
Ö = oe
Ü = ue

スカンジナビア人は安心しているようですが

Ä => a
Ö => o
Ø => o

等々。

次に、さまざまなアクセントのある文字éáó...があります。

それらを完全に削除すると、bwsrアドレスbrで実際にbdおよびlokstrngに見えるURLになります。

于 2009-12-08T22:50:31.150 に答える
0

ファイル名を「検証」する必要はないと思います。希望する形式でない場合は、ファイル名を「修正」するだけです。誰かがファイルに名前を付けるのが嫌だったり、変わった文字が含まれているという理由だけでファイルを拒否するのはなぜですか?また、画像を操作している場合は、getimagesize前述のように使用して、実際にアップロードされた画像であることを確認できます(画像でない場合は失敗するはずです)。

于 2009-12-08T23:36:23.397 に答える