役立つ情報
登録日: 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);

Copyright 役立つ情報.net