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()などで正規化するとさらに安全です。
- サーバーに不要なファイルが蓄積しないよう、定期的なメンテナンスも検討しましょう。