3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelファイルストレージ 保存用のメソッドについて

Posted at

はじめに

この記事ではLaravelのファイル保存用メソッドの使い方や違いについて書いています。
公式ドキュメントを参考にしています。

各メソッドについて

以下のメソッドについて説明しています。

  1. $request->file()->store()
  2. $request->file()->storeAs()
  3. Storage::put()
  4. Storage::putFile()
  5. Storage::putFileAs()

$request->file()->store()

file()の引数にはキー名、store()の引数には保存先のディレクトリ名を入れます。fileの引数に入れるのはフォームのinputに設定したnameの値です。

use Illuminate\Http\Request;

public function upload(Request $request)
{
    $path = $request->file('example_image')->store('test');
    print_r($path); // test/{ファイル名}.{拡張子}
}

上記の例ではプロジェクトディレクトリ/storage/app/test/{ファイル名}のように保存されます。この保存先はデフォルトで使用するディスクがlocalの場合のものです。ここより後の例も同様です。

ファイル名は$file->hashName()で出力されるものと同じで、自動的に設定されます。

public function upload(Request $request)
{
  $file = $request->file('example_image');
  print_r($file->hashName());
}

第二引数でdiskを指定することもできます。

public function upload(Request $request)
{
    $request->file('example_image')->store('test', 'public');
}

プロジェクトディレクトリ/storage/app/public/test/{ファイル名}のように保存されます。

$request->file()->storeAs()

storeAs()は第一引数、第二引数にそれぞれ「ディレクトリ名」、「ファイル名」を入れます。

use Illuminate\Http\Request;

public function upload(Request $request)
{
  $path = $request->file('example_image')->storeAs('test', 'example_image.png');
  print_r($path); // test/example_image.png
}

プロジェクトディレクトリ/storage/app/test/example_image.pngのように保存されます。
store()と同様に第三引数でディスクを指定できます。

storeAs('test', 'example_image.png', 'public');

Storage::put()

ここからはStorageファザードのメソッドになります。
put()は第一引数に保存先ディレクトリ、第二引数にはIlluminate\Http\UploadedFileクラスかIlluminate\Http\Fileクラスのインスタンスを入れます。下記の$fileIlluminate\Http\UploadedFileクラスのインスタンスになります。

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

public function upload(Request $request)
{
    $file = $request->file('example_image');
    $path = Storage::put('test', $file);
    print_r($path); // test/{フォルダ名}.{拡張子}
}

先ほど説明したstore()と同じ動作になります。つまりプロジェクトディレクトリ/storage/app/test/{ファイル名}のようにファイルが保存され、ファイル名は$file->hashName()で取得できるものと同じです。

$request->file('example_image')->store('test')

下記のようにディスクの指定することもできます。

public function upload(Request $request)
{
  $file = $request->file('example_image');
  Storage::disk('public')->put('test', $file);
}

Storage::putFile()

Storage::put()とほぼ同じになります。

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

public function upload(Request $request)
{
  $file = $request->file('example_image');
  $path = Storage::putFile('test', $file);
  print_r($path); // test/{ファイル名}
}

Storage::put()との違いは保存するまで過程です。Storage::put()が一度メモリを経由して保存されるのに対して、こちらはファイルを直接保存します。Storage::putFile()はメモリを節約できるため、容量が大きいファイルを保存する際に推奨されるようです。ちなみにこの直接保存する方法をドキュメントでは「自動ストリーミング」と呼んでいました。
自動ストリーミングについては下記を参考にしました。

Storage::putFileAs()

$request->file()->storeAs()と同じような動作になります。

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

public function index(Request $request)
{
  $file = $request->file('example_image');
  $path = Storage::putFileAs('test', $file, 'example_image.png');
  print_r($path); // test/example_image.png
}

プロジェクトディレクトリ/storage/app/test/example_image.pngのように保存されます。

参考

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?