Webアプリケーションにファイルアップロード機能を実装する際、ファイルの種類(画像、ドキュメント、CSVなど)によって保存先フォルダを分けることで、管理やセキュリティの面で非常に便利になります。この記事では、PHPで拡張子ごとにアップロードフォルダを自動的に振り分ける方法を具体的に解説します。
基本のフォルダ構成
以下のようなフォルダを事前に用意しておきます(存在しない場合は自動作成することも可能です)
uploads/
├── images/
├── documents/
├── csv/
└── others/
アップロード処理の実装コード
以下のコードは、アップロードされたファイルの拡張子を判定し、それに応じたフォルダに自動で振り分けて保存します。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) {
$file = $_FILES['upload_file'];
$filename = $file['name'];
$tmp_path = $file['tmp_name'];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
// 拡張子ごとの保存先を指定
switch ($ext) {
case 'jpg':
case 'jpeg':
case 'png':
case 'gif':
$target_dir = 'uploads/images/';
break;
case 'pdf':
case 'doc':
case 'docx':
$target_dir = 'uploads/documents/';
break;
case 'csv':
$target_dir = 'uploads/csv/';
break;
default:
$target_dir = 'uploads/others/';
break;
}
// 保存先フォルダが存在しない場合は作成
if (!is_dir($target_dir)) {
mkdir($target_dir, 0755, true);
}
// 重複を避けるためにファイル名を一意にする
$unique_name = uniqid() . '_' . basename($filename);
$target_path = $target_dir . $unique_name;
// アップロード処理
if (move_uploaded_file($tmp_path, $target_path)) {
echo "ファイルをアップロードしました:{$target_path}";
} else {
echo "ファイルのアップロードに失敗しました。";
}
}
?>
アップロードフォーム(HTML)
上記のPHPと一緒に使うシンプルなフォームです。
<form method="POST" enctype="multipart/form-data">
<input type="file" name="upload_file" required>
<button type="submit">アップロード</button>
</form>
実装上のポイント
- 拡張子の判定は必ず小文字で行う(strtolower() を使用)
- 保存先ディレクトリが存在しない場合は自動作成しておくと安全
- ファイル名の重複を防ぐために uniqid() でユニーク化する
- ファイルアップロードの最大サイズ制限やMIMEタイプのチェックもセキュリティ上は重要(今回は省略)
まとめ
PHPでファイルの拡張子に応じて保存先フォルダを自動的に切り替えることで、アップロードファイルの管理が効率化され、セキュリティや可読性も向上します。画像・ドキュメント・CSVなど、種類ごとに処理を分けたいときには非常に有用なテクニックです。