登録日:
2025-02-03
最終更新日:
2025-03-19
Laravel におけるファイルアップロードのファイル情報取得について
Laravel でファイルアップロード時にファイル情報を取得する方法を紹介します。ファイルのパス、MIMEタイプ、サイズ、拡張子など、さまざまな情報を取得できます。
アップロードされたファイルの情報取得
Laravel の Request オブジェクトを使用すると、簡単にファイル情報を取得できます。
基本的なファイル情報
public function upload(Request $request)
{
$file = $request->file('file'); // アップロードされたファイルの取得
if ($file) {
$originalName = $file->getClientOriginalName(); // 元のファイル名
$extension = $file->getClientOriginalExtension(); // 元の拡張子
$mimeType = $file->getMimeType(); // MIMEタイプ
$size = $file->getSize(); // サイズ(バイト単位)
$tempPath = $file->getPathname(); // 一時保存パス
$hashName = $file->hashName(); // Laravelが自動生成するハッシュ名
return response()->json([
'original_name' => $originalName,
'extension' => $extension,
'mime_type' => $mimeType,
'size' => $size,
'temp_path' => $tempPath,
'hash_name' => $hashName,
]);
}
return response()->json(['error' => 'ファイルがアップロードされていません'], 400);
}
メソッド | 説明 |
---|---|
$file->getClientOriginalName() | 元のファイル名 |
$file->getClientOriginalExtension() | 元の拡張子 |
$file->getMimeType() | MIMEタイプ |
$file->getSize() | ファイルサイズ(バイト) |
$file->getPathname() | 一時保存のパス |
$file->hashName() | ハッシュ化されたファイル名 |
ファイルの保存後に情報を取得
ファイルを storage や public に保存した後、保存されたパスやURLを取得することもできます。
ファイルを保存して情報取得
public function uploadAndStore(Request $request)
{
$file = $request->file('file');
if ($file) {
// 'uploads' ディレクトリに保存(storage/app/uploads に保存される)
$path = $file->store('uploads');
return response()->json([
'stored_path' => $path, // 例: uploads/abcd1234.jpg
'full_path' => storage_path("app/{$path}"), // 完全なパス
'public_url' => asset("storage/{$path}") // 公開URL(storage:linkが必要)
]);
}
return response()->json(['error' => 'ファイルがアップロードされていません'], 400);
}
- storage_path("app/{$path}") → ファイルの完全なサーバー内のパスを取得
- asset("storage/{$path}") → storage:linkを設定すれば公開URLが取得可能
MIMEタイプと拡張子のチェック
Laravel では拡張子や MIME タイプを取得できますが、セキュリティのために mimes バリデーションと MIME チェックを併用すると安全です。
拡張子のチェック
$allowedExtensions = ['jpg', 'png', 'pdf'];
if (!in_array($file->getClientOriginalExtension(), $allowedExtensions)) {
return response()->json(['error' => '許可されていないファイル形式です'], 400);
}
MIMEタイプのチェック
$allowedMimes = ['image/jpeg', 'image/png', 'application/pdf'];
if (!in_array($file->getMimeType(), $allowedMimes)) {
return response()->json(['error' => '不正なMIMEタイプのファイルです'], 400);
}
バリデーションでチェック
$request->validate([
'file' => 'required|file|max:2048|mimes:jpg,png,pdf'
]);
一時ファイルの情報取得
アップロードされたファイルは、保存される前に一時的なディレクトリに配置されます。その情報を取得できます。
$tempPath = $file->getPathname(); // 一時ファイルのパス
Laravelは、リクエストが完了すると一時ファイルを自動的に削除するため、必要な情報は保存前に取得するのが重要です。
ファイルのハッシュ名を取得
保存時にファイル名が重複しないように、自動でハッシュ名を作成することができます。
$hashedName = $file->hashName(); // 例: 8f42bd9e3f4d4f4b90e7c84cdfe12345.jpg
これは、Laravel の store() や storeAs() で使用すると、保存時に一意のファイル名を作成できます。
$path = $file->storeAs('uploads', $file->hashName());
ファイル情報のログ出力
デバッグ用に、ファイル情報をログに出力することも可能です。
use Illuminate\Support\Facades\Log;
Log::info('Uploaded File Info', [
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'mime_type' => $file->getMimeType(),
'size' => $file->getSize(),
'hash_name' => $file->hashName(),
]);
Laravel のログシステムを使うと、アップロードされたファイル情報を記録し、トラブルシューティングに役立ちます。
ファイル情報を取得するユーティリティメソッド
よく使うファイル情報取得処理をメソッド化すると便利です。
public function getFileInfo($file)
{
return [
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'mime_type' => $file->getMimeType(),
'size_kb' => round($file->getSize() / 1024, 2) . ' KB',
'hash_name' => $file->hashName(),
'temp_path' => $file->getPathname(),
];
}
使用例
$file = $request->file('file');
$fileInfo = $this->getFileInfo($file);
return response()->json($fileInfo);