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

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

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

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

Q&A

解決済

1回答

1934閲覧

Laravel9 Storage::delete() でファイルの削除ができない。

tkm0604

総合スコア552

Laravel

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

0グッド

0クリップ

投稿2022/09/28 07:41

Laravel9でアップロードした画像を削除ができません。
エラーも起きずそのままリダイレクト先に遷移します。
しかし画像が削除されません。

ProfileController.php

1 public function company_img_destroy(){ 2 // 削除したい画像のパスを情報を取得する 3 $delFileName = Auth::user()->company_img; 4 // storage/app/public/images/company_imgから、画像ファイルを削除する 5 Storage::delete('storage/images/company_img'.$delFileName); 6 return redirect('mypage/dashboard')->with('successMessage', 'プロフィール情報を更新しました'); 7 }

web.php

1 Route::get('company_img_destroy', [App\Http\Controllers\ProfileController::class, 'company_img_destroy'])->name('company_img_destroy'); 2 Route::post('company_img_destroy', [App\Http\Controllers\ProfileController::class, 'company_img_destroy'])->name('company_img_destroy');
<form method="post" class="edit-profile-form" action="{{ route('mypage.edit-profile') }}" enctype="multipart/form-data"> @csrf <table class="edit-profile-form__table"> <tbody> <tr> <th> <p class="edit-profile-title">会社名(屋号)</p> <p class="edit-profile-title"></p> </th> <td> <input value="{{ $user->company_name }}" class="edit-profile-input" name="company_name" type="text"> </td> </tr> <tr> <th> <p class="edit-profile-title">フリガナ</p> <p class="edit-profile-title"></p> </th> <td> <input value="{{ $user->company_name_kana }}" class="edit-profile-input" name="company_name_kana" type="text"> </td> </tr> <tr> <th> <p class="edit-profile-title">プロフィール画像</p> </th> <td> <div class="myImage-wrap"> @if($user->company_img === null) <img id="preview" src="{{ asset('images/top_no_image.jpeg')}}" alt=""> @endif <img id="preview" src="{{ asset('storage/images/company_img/' . $user->company_img) }}" alt=""> </div> <input id="myImage" class="edit-profile-input" name="company_img" value="" type="file"> <a href="{{ route('company_img_destroy')}}" type="submit" value="削除" form="delate" name="del_id">削除</a> </td> </tr> <tr> <th> <p class="edit-profile-title">電話番号</p> </th> <td> <input value="@if(is_null($user->company_add)){{ old('company_tel') }}@else{{ $user->company_tel }}@endif" class="edit-profile-input" name="company_tel" type="text"> </td> </tr> </tbody> </table> <div class="edit-profile-submit"> <button class="edit-profile-submit__button" type="submit" value="保存する"> <span class="edit-profile-submit__button--txt">保存する</span> </button> </div> </form> {{-- company_img削除用のform。aタグ form="delate"と対 --}} <form action="post" id="delate" name="del_id"></form>

プロフィール編集用<form>タグの中に画像削除用のformを入れれなかったので、<form method="post" class="edit-profile-form" action="{{ route('mypage.edit-profile') }}" enctype="multipart/form-data"></form>の外に削除用フォーム<form action="post" id="delate" name="del_id"></form>を設置。

<a href="{{ route('company_img_destroy')}}" type="submit" value="削除" form="delate" name="del_id">削除</a>のform="delate" と<form action="post" id="delate" name="del_id"></form>id="delate"が対になるようにしています。

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

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

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

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

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

m.ts10806

2022/09/28 07:45

$delFileNameには何が入ってるのでしょう。 いったんdelete()直後でdd()で止めてみれば何が起きているか分かるかもしれません。
tkm0604

2022/09/28 07:50

コメントありがとうございます。 delete()直前でdd($delFileName);を行うと、ユーザーのcompnay_imgカラムに保存されている画像のパス(ファイル名)が取得されています。この画像はstorage/app/public/images/company_img に保存されています。
m.ts10806

2022/09/28 08:55

ファイル名だけですか? でしたら 'storage/images/company_img'.$delFileName これだと a.jpgとしたら storage/images/company_imga.jpg になりませんか?
tkm0604

2022/09/30 05:44

コメントありがとうございます。 Storage::delete('storage/images/company_img/'.$delFileName); としてみたのですが、いまだにファイルの削除ができません。。。。
m.ts10806

2022/09/30 05:59

エラーログに何か出ていませんか? 本当にそのパスで合っているかは検証必要です。
tkm0604

2022/09/30 06:21 編集

ありがとうございます。 画像パスに関しては、devツールにて src="http://localhost/storage/images/company_img/20220930_141955_IMG_3570.jpg" と画像のパスが確認できています。 Storage::delete('storage/images/company_img/'.$delFileName);で削除する画像のパスは間違えていないと思うのですが、、、 コード全体は以下です。 public function company_img_destroy(){ // プロフィール画像(パス)を取得する $delFileName = Auth::user()->company_img; // storage/app/public/images/company_imgから、画像ファイルを削除する Storage::delete('storage/images/company_img/'.$delFileName); \Log::debug('company_img_destroy ', [$delFileName]); return redirect('mypage/dashboard')->with('successMessage', 'takoyaki'); }
tkm0604

2022/09/30 06:24

コントローラーの中に\Log::debugを入れてみました。 logを確認すると、 [2022-09-30 15:19:26] local.DEBUG: company_img_destroy ["20220930_151551_stephen-phillips-hostreviews-co-uk-zs98a0DtKL4-unsplash.jpg"] とログが出力されています。
m.ts10806

2022/09/30 06:32

storageディレクトリってWebから参照できないはずの場所にあると思います。(その名の通りなので) storage_path()はどこになっていますか?
tkm0604

2022/09/30 08:49

storage/app/public/images/company_img に削除したい画像が保存されており、シンボリックでpublic/storage/images/company_img とリンクしております。 (storage_path()はどこになっていますか?に対する回答として勘違いしていないでしょうか?)
m.ts10806

2022/09/30 08:53 編集

なるほどシンボリックリンクしてるわけですね。 いえ、 storage_path()がstorage/を指してればよいなと。 質問本文に記載いただければと。 では Storage::delete('app/public/images/company_img/'.$delFileName); もしくは Storage::delete('images/company_img/'.$delFileName); とした場合は?
tkm0604

2022/10/01 08:10

コメントありがとうございます。 Storage::delete('app/public/images/company_img/'.$delFileName); もしくは Storage::delete('images/company_img/'.$delFileName); にしてみても結果変わらず、エラーも起きずそのままリダイレクト先に遷移します.... どこか他に疑ってみるところはあるのでしょうか。。。。。
tkm0604

2022/10/03 06:46

ご指摘いただいていたようにパスの指定が謝っていました。 他に原因があるのか?と周り道しましたが、以下で無事に削除できるようになりました。 public function company_img_destroy(Request $request,User $user){ // フォームで指定されたIDの情報をデータベースから取得する $delFileName = Auth::user()->company_img; $path = Storage::path($delFileName); //'public/images/company_img'から、画像ファイルを削除する Storage::delete('public/images/company_img/'.$delFileName); \Log::debug('public/images/company_img_destroy ', [$path]); return redirect('/mypage/edit-profile')->with('successMessage', '画像を削除しました。'); }
m.ts10806

2022/10/03 06:56

すみません。エラーの有無より実際に削除されているかどうかを確認してもらいたかったのです。。
guest

回答1

0

ベストアンサー

エラーになっていないので指定したファイルが削除されているはず、と思い込んでいるようですが、Storage::delete()は指定したファイルがはじめから存在しないときもエラーにはなりません。削除されないとするならファイルをうまく指定できていない可能性が非常に高いです。

同じパラメタでStorage::path()を使えばStorageが削除するつもりのフルパスが得られるので、まずそれをログに出力するなどして確認するといいと思います。

ファイルパス

参考: \League\Flysystem\Local\LocalFilesystemAdapter::delete(ファイルが存在しないしないときは単にreturnしています)

php

1 public function delete(string $path): void 2 { 3 $location = $this->prefixer->prefixPath($path); 4 5 if ( ! file_exists($location)) { 6 return; 7 } 8 9 error_clear_last(); 10 11 if ( ! @unlink($location)) { 12 throw UnableToDeleteFile::atLocation($location, error_get_last()['message'] ?? ''); 13 } 14 }

投稿2022/10/02 21:48

crhg

総合スコア1175

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

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

tkm0604

2022/10/03 06:45

Storage::path()とlogを用いてパスを確認したところ、パスの指定に誤りがありました!! ありがとうございます。 以下のようにする事でLaravelのstorageに保存した画像が削除できました!! public function company_img_destroy(Request $request,User $user){ // フォームで指定されたIDの情報をデータベースから取得する $delFileName = Auth::user()->company_img; $path = Storage::path($delFileName); //'public/images/company_img'から、画像ファイルを削除する Storage::delete('public/images/company_img/'.$delFileName); \Log::debug('public/images/company_img_destroy ', [$path]); return redirect('/mypage/edit-profile')->with('successMessage', '画像を削除しました。'); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問