質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

12334閲覧

Laravel Storage の put() と putFileAs() の違いがわからない。

takaoS

総合スコア9

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

1グッド

0クリップ

投稿2020/07/09 08:17

編集2020/07/11 02:23

初歩的な質問ですみません。

LaravelのStorageのメソッドで、put() と putFileAs() の違いがよくわかりません。

公式ドキュメントの日本語訳(https://readouble.com/laravel/6.x/ja/filesystem.html)を見てみると、purFileAs()では自動ストリーミングを管理してくれると書いてあるのですが、よく意味がわからなくて...。

ストリーミングとは、YouTubeのように、少しずつデータをダウンロードしつつ、同時並行で動画を流すことだと思っているのですが、putFileAs()でも同じように、少しずつ画像をアップロードしてくれるということなのでしょうか?

その場合、画像をサーバにアップロードする点に関して、put()と比較してどのようなメリットがあるのでしょうか?

教えて頂けると嬉しいです。
よろしくお願いいたします。

pafe.aratani👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/10 12:26

>公式ドキュメントを見てみると、 公式と言うとlaravel.comからのDocumentationですが、そちらで間違いないですか?齟齬があってはいけませんので、URLをリンクで提示してください。
m.ts10806

2020/07/10 22:44

質問は編集できますので追記してください
m.ts10806

2020/07/10 22:46

ちなみにreadoubleは「公式ドキュメント」ではないです。 「公式を日本語訳したドキュメント」です。公式に近しいものであって公式はあくまで先に提示したlaravel.comです。
takaoS

2020/07/11 02:22

そうなんですね、申し訳ないです。
m.ts10806

2020/07/11 02:24 編集

私もteratailの回答で指摘されて認識したことなので、謝ることはないと思います。 ただ、原文を結構正確に訳しているので、大きな問題はないと思ってます。
guest

回答1

0

ベストアンサー

この場合の「ストリーミング」というのは「書き込みたい内容をPHPの変数として一度にメモリ上に用意しなくていい」ぐらいの意味です。

そしてストリームサポートはマニュアルの少し手前のところに書かれているようにputにもあります。

putメソッドはファイル内容をディスクへ保存するために使用します。putメソッドにはPHPのresourceも渡すことができ、Flysystemの裏で動いているストリームサポートを使用します。

まずストリーミングでない場合はどういうものか説明します。put$contentsパラメタに送りたいファイルの中身を設定するのが基本の使い方で、例えば画像ファイルならいったんfile_get_contentsを使って全体を変数に読み込んでからputします。一度に全部メモリ上に読み込むのでメモリを食います。

php

1$contents = file_get_contents('foo.jpg'); 2Storage::put('file.jpg', $contents);

ストリーミングの場合はどうなるかというと、ファイルを開いただけで中身は読み込まずにそのままリソースをパラメタとして渡します。こちらの場合は一度に中身を読み込まずに一定量ずつ読んでは書くようなことを裏で行ってくれるのでメモリの消費が抑えられます。

php

1$resource = fopen('foo.jpg', 'r'); 2Storage::put('file.jpg', $resource); 3fclose($resource);

そしてputFileAsはパラメタで与えたファイル名からfopenしてputしてfcloseという一連の流れを「自動」でやってくれます。実際ソースはこうなっています。これを「自動ストリーミング」と呼んでいるようです。

php

1 /** 2 * Store the uploaded file on the disk with a given name. 3 * 4 * @param string $path 5 * @param \Illuminate\Http\File|\Illuminate\Http\UploadedFile|string $file 6 * @param string $name 7 * @param array $options 8 * @return string|false 9 */ 10 public function putFileAs($path, $file, $name, $options = []) 11 { 12 $stream = fopen(is_string($file) ? $file : $file->getRealPath(), 'r'); 13 14 // Next, we will format the path of the file and store the file using a stream since 15 // they provide better performance than alternatives. Once we write the file this 16 // stream will get closed automatically by us so the developer doesn't have to. 17 $result = $this->put( 18 $path = trim($path.'/'.$name, '/'), $stream, $options 19 ); 20 21 if (is_resource($stream)) { 22 fclose($stream); 23 } 24 25 return $result ? $path : false; 26 }

投稿2020/07/11 05:57

crhg

総合スコア1177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takaoS

2020/07/12 03:21

なるほど、そういうことだったのですね。 ご丁寧に解説いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問