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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

3回答

4615閲覧

Storage::download直後にファイルを削除する方法を知りたいです。

trigger

総合スコア8

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2021/05/08 18:16

前提・実現したいこと

laravelでStorage::downloadを実行した後、該当ファイルを削除する方法を知りたいです。

該当のソースコード

laravel

1return Storage::download('public/files/' . $file_name . ".txt");

試したこと

あわよくば、以下のような形で削除できるのでは?と考えていました。

laravel

1return Storage::download('public/files/' . $file_name . ".txt")->delete();

しかし、、
returnされる値は、Symfony\Component\HttpFoundation\StreamedResponseのオブジェクトだと思うのですが、このオブジェクトは特にファイルを削除するメソッドを持っていませんでした。

アドバイス、アイデアをいただきたく思います。
よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

laravel 8です。

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

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

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

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

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

m.ts10806

2021/05/08 21:45

そのファイルはどのように当該箇所に置かれているのでしょうか。
trigger

2021/05/09 01:35

ご回答有り難うございます。 画像ファイルは、storage/app/public/files/です。 publicからであれば、シンボリックリンクでアクセスするようになっているので、storage/files/です。
m.ts10806

2021/05/09 04:00

置き場所というより、どうやってそこに配置されるかという点です
trigger

2021/05/09 04:48

なるほど、すみません。 file_put_contentsを使用して保存、配置しています。 file_put_contents( $path . $file_name . ".txt", $textData); のような記述方法で、$pathは'storage/files/'を指定し、$file_nameはランダムな英数字です。 機能の大まかな流れとしては、webテキストを入力->form送信->ファイル保存->ダウンロード->削除 という仕様になっています。
guest

回答3

0

Laravel8なら一番簡単なのはdispatchAfterResponse
https://readouble.com/laravel/8.x/ja/queues.html#dispatching-after-the-response-is-sent-to-browser
1回だけならクロージャで十分。

php

1$file = 'public/files/' . $file_name . ".txt"; 2 3dispatch(function () use ($file) { 4 Storage::delete($file); 5})->afterResponse(); 6 7return Storage::download($file);

ただしファイルダウンロードで上手く動くかは分からないけど。


旧バージョンではキューで「数分後に削除」みたいなことをしていた。

php

1$file = 'public/files/' . $file_name . ".txt"; 2DeleteJob::dispatch($file)->delay(now()->addMinutes(5)); 3 4return Storage::download($file);

他にも
キューを使わないならダウンロード時点ではファイルはそのまま残して
artisanコマンドとcronで定期的に削除。
Laravel通す必要もないのでcronだけで(フルパス)/storage/files/のファイルを自動的に削除でもいい。

やり方はいろいろある。

投稿2021/05/09 02:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

すみません、自己解決致しました。

以下のような記述で上手く行きました。

return response()->download($full_path, $rename)->deleteFileAfterSend(true);

公式ドキュメントを参考にresponse()を使用してファイルダウンロードを行い、returnされるSymfony\Component\HttpFoundation\BinaryFileResponseのdeleteFileAfterSendメソッドを使用することで解決できました。

様々なアイデアをいただけましたことに、感謝します!

投稿2021/05/09 04:42

trigger

総合スコア8

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

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

0

ファイルを消すだけであれば以下で可能ではないですか?

Storage::delete('public/files/' . $file_name . ".txt");

しかし、この方法は実際にはうまくいかないと思います。Storage::download メソッドは、ブラウザにダウンロードするように司令するレスポンスを返すだけで、現実にはまだダウンロードは始まっていないからです。なので、ダウンロードが始まる前にファイルが削除されてしまい、File not found(404)になりそうです。

投稿2021/05/09 01:07

ockeghem

総合スコア11705

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

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

trigger

2021/05/09 01:46

ご回答有難うございます。 おっしゃる通りで、ファイルを削除するだけであればStorage:;deleteで物足ります。 しかし、ダウンロード->削除を行いたいので、これは不可能でした。 returnでStorage::downloadを返さなければそもそもダウンロードが始まらないので、一度に実行するのが難しい状態です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問