URLから取得した画像ファイルをStorageファサードを使い
storage/app/public/下に保存した時に、少し詰まったのでメモ。
Storageファザードを使ってファイルを保存する方法
Storageファザードを使ってファイルを保存する方法は以下 公式リファレンスより抜粋 https://readouble.com/laravel/5.5/ja/filesystem.htmluse Illuminate\Support\Facades\Storage;
Storage::put('file.jpg', $contents);
Storage::put()を使うと、第一引数にファイル名、第二引数に保存したいファイルを入れます。
そうすると通常はstorage/app/public/内に画像が保存されます。
でも、保存先フォルダも指定したい!
という場合はこちら
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などのクラウドディスクにファイルを保存する場合もこの方法で大丈夫なのではないかとおもいます!