LoginSignup
9
4

More than 3 years have passed since last update.

Laravel 5.5 Storageファサードで画像ファイルを保存

Posted at

URLから取得した画像ファイルをStorageファサードを使い
storage/app/public/下に保存した時に、少し詰まったのでメモ。

Storageファザードを使ってファイルを保存する方法

Storageファザードを使ってファイルを保存する方法は以下
公式リファレンスより抜粋
https://readouble.com/laravel/5.5/ja/filesystem.html

readouble.com/laravel/5.5/ja/filesystem.html
use Illuminate\Support\Facades\Storage;

Storage::put('file.jpg', $contents);

Storage::put()を使うと、第一引数にファイル名、第二引数に保存したいファイルを入れます。
そうすると通常はstorage/app/public/内に画像が保存されます。

でも、保存先フォルダも指定したい!
という場合はこちら

readouble.com/laravel/5.5/ja/filesystem.html
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;

// 自動的に一意のIDがファイル名として指定される
Storage::putFile('photos', new File('/path/to/photo'));

// ファイル名を指定する
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

引数はそれぞれ以下の通りです。
Storage::putFile(保存先, new File('ファイルのパス'));
Storage::putFileAs('保存先', new File('ファイルのパス'), ファイルの名前);

今回はファイル名も指定したい、保存先も指定したい、とのことで、
Storage::putFileAs()を使うことにしました。

詰まったところ。 ファイルのパスって?

Illuminate\Http\Fileのインスタンスの引数にファイルのパス指定しますが、
ファイルのパスの取り方が思いつかなくて少し考えました。

が、簡単にできました。

一時ファイルを使います。


//画像のURL
$url = 'https::example.com/img.jpg';
//URLからファイル名を取得 ここはお好きな方法でファイル名を決めてください。
$file_name = substr(strrchr($url,"/"),1);
//URLからファイル取得
$img_downloaded = file_get_contents($url);
//一時ファイル作成
$tmp = tmpfile();
//一時ファイルに画像を書き込み
fwrite($tmp, $img_downloaded);
//一時ファイルのパスを取得
$tmp_path = stream_get_meta_data($tmp)['uri'];
//storageに保存。
Storage::putFileAs('images', new File($tmp_path), $file_name);
//一時ファイル削除
fclose($file_handle);

ちゃんとstorage/app/public/images/下に保存できました!
publict直下に保存したい時は

Storage::putFileAs('', new File($tmp_path), $file_name);

フォルダの指定を空にすればOKです!

S3などのクラウドディスクにファイルを保存する場合もこの方法で大丈夫なのではないかとおもいます!

9
4
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
9
4