【PHP】ファイルアップロード時にファイル名を自動リネームして保存する方法

【PHP】ファイルアップロード時にファイル名を自動リネームして保存する方法 PHP

PHPでファイルアップロード機能を実装する際、アップロードされたファイル名が他のファイルと重複すると、既存ファイルが上書きされる恐れがあります。これを防ぐために、ファイル名を自動でリネームして保存する方法をご紹介します。

基本のファイルアップロード処理

まず、通常のファイルアップロード処理の基本形です。

if (isset($_FILES['upload_file']) && $_FILES['upload_file']['error'] === UPLOAD_ERR_OK) {
    $upload_dir = 'uploads/';
    $original_name = $_FILES['upload_file']['name'];
    $tmp_path = $_FILES['upload_file']['tmp_name'];
    $save_path = $upload_dir . $original_name;

    if (move_uploaded_file($tmp_path, $save_path)) {
        echo 'アップロード成功:' . $save_path;
    } else {
        echo 'アップロードに失敗しました。';
    }
}

このままだと、同じファイル名がアップロードされると上書きされてしまいます。

ファイル名を自動リネームする方法

方法1 タイムスタンプを追加する

$ext = pathinfo($original_name, PATHINFO_EXTENSION);
$new_name = date('YmdHis') . '_' . uniqid() . '.' . $ext;
$save_path = $upload_dir . $new_name;

このようにすれば、ファイル名の重複を確実に防げます。

方法2 元のファイル名を残しつつ一意なIDを追加する

$base_name = pathinfo($original_name, PATHINFO_FILENAME);
$ext = pathinfo($original_name, PATHINFO_EXTENSION);
$new_name = $base_name . '_' . uniqid() . '.' . $ext;
$save_path = $upload_dir . $new_name;

元のファイル名を残すことで、後から見たときに何のファイルか分かりやすくなります。

最終的なアップロード処理のサンプルコード

if (isset($_FILES['upload_file']) && $_FILES['upload_file']['error'] === UPLOAD_ERR_OK) {
    $upload_dir = 'uploads/';
    $original_name = $_FILES['upload_file']['name'];
    $tmp_path = $_FILES['upload_file']['tmp_name'];

    $base_name = pathinfo($original_name, PATHINFO_FILENAME);
    $ext = pathinfo($original_name, PATHINFO_EXTENSION);
    $new_name = $base_name . '_' . uniqid() . '.' . $ext;
    $save_path = $upload_dir . $new_name;

    if (move_uploaded_file($tmp_path, $save_path)) {
        echo 'アップロード成功:' . htmlspecialchars($save_path, ENT_QUOTES, 'UTF-8');
    } else {
        echo 'アップロードに失敗しました。';
    }
}

注意点

  • uploads/ ディレクトリには書き込み権限が必要です(例:chmod 755や777)。
  • ファイル名に使えない文字が含まれる可能性があるため、preg_replace()などで正規化するとさらに安全です。
  • サーバーに不要なファイルが蓄積しないよう、定期的なメンテナンスも検討しましょう。