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

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

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

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

解決済

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

tkm0604
tkm0604

総合スコア533

Laravel

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

1回答

0リアクション

0クリップ

266閲覧

投稿2022/09/28 07:41

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

ProfileController.php

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

web.php

Route::get('company_img_destroy', [App\Http\Controllers\ProfileController::class, 'company_img_destroy'])->name('company_img_destroy'); 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"が対になるようにしています。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Laravel

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