[Laravel] アップロードしたファイルの情報を取得する

ITLaravel, PHP

Laravelでアップロードしたファイルの情報を取得したい時に使えるメソッド一覧です。

参考:https://laravel.com/docs/5.8/requests#files

SymphonyのUploadedFileを使っているようです。

https://github.com/symfony/symfony/blob/3.0/src/Symfony/Component/HttpFoundation/File/UploadedFile.php

Laravelのプロジェクト内では、こちらに

PROJECT_NAME/vendor/symfony/http-foundation/File/UploadedFile.php

検証手順として、inputタイプがfile、nameがimage、testtes.pngをアップロードした場合で

下記のようにヘルパー関数dd(dump and die)を使って出力結果を確認しました。

public function store(Request $request)
{
    dd($request->image->getClientOriginalName());
}

 

アップロードされるファイル名を取得(getClientOriginalName)

$request->image->getClientOriginalName();

結果

"testtest.png"

 

アップロードされるファイルの拡張子をを取得(getClientOriginalExtension)

$request->image->getClientOriginalExtension();

結果

"png"

 

アップロードされるファイルのMIMEタイプを取得(getClientMimeType)

$request->image->getClientMimeType();

結果

"image/png"

 

アップロードされるファイルのMIMEタイプから予想される拡張子を取得(guessClientExtension)

$request->image->guessClientExtension();

結果

"png"

 

アップロードされるファイルのサイズをバイトで取得(getClientSize)

$request->image->getClientSize();

結果

2513

(※testtest.pngは2513バイトです。)

 

ファイルアップロードのエラーを取得(getError)

$request->image->getError();

結果

0

(※アップロードは成功してます。コンスタントのUPLOAD_ERR_OKの値のようです。)

 

ファイルのアップロードが成功したかどうか結果を取得(isValid)

結果

true

 

アップロードしたファイルを指定したディレクトリに移動する(move)

$request->image->move($directory, NEW_FILE_NAME);

結果

新しいファイル名で移動されました。

 

php.iniで定義されているアップロードされるファイルの最大サイズを取得(getMaxFilesize)

$request->image->getMaxFilesize()

結果

20971520

(バイトです。)

phpinfoでの出力結果が、、

post_max_size 20MB
upload_max_filesize 20MB

だったので、20MB == 20971520Byte ですね。(どちらの値を取ってきてるのかまでは追いませんが)

 

アップロードしたファイルのエラーメッセージを取得(getErrorMessage)

$request->image->getErrorMessage()

結果

"The file "testtest.png" was not uploaded due to an unknown error."

このエラーメッセージを見た時「あれ、アップロード失敗?」と思ったのですが、メソッドをよく見ると

    /**
     * Returns an informative upload error message.
     *
     * @return string The error message regarding the specified error code
     */
    public function getErrorMessage()
    {
        static $errors = array(
            UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).',
            UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.',
            UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.',
            UPLOAD_ERR_NO_FILE => 'No file was uploaded.',
            UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.',
            UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',
            UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.',
        );
        $errorCode = $this->error;
        $maxFilesize = $errorCode === UPLOAD_ERR_INI_SIZE ? self::getMaxFilesize() / 1024 : 0;
        $message = isset($errors[$errorCode]) ? $errors[$errorCode] : 'The file "%s" was not uploaded due to an unknown error.';
        return sprintf($message, $this->getClientOriginalName(), $maxFilesize);
    }

$this->error には、UPLOAD_ERR_OK が入ってくると思うので、、エラーじゃない時に返されるメッセージみたいですね。

[検証環境]
Laravel 5.8.23
PHP 7.2.4

以上になります。

スポンサーリンク

Posted by nobuhiro harada