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"が対になるようにしています。
$delFileNameには何が入ってるのでしょう。
いったんdelete()直後でdd()で止めてみれば何が起きているか分かるかもしれません。
コメントありがとうございます。
delete()直前でdd($delFileName);を行うと、ユーザーのcompnay_imgカラムに保存されている画像のパス(ファイル名)が取得されています。この画像はstorage/app/public/images/company_img に保存されています。
ファイル名だけですか?
でしたら
'storage/images/company_img'.$delFileName
これだと
a.jpgとしたら
storage/images/company_imga.jpg
になりませんか?
コメントありがとうございます。
Storage::delete('storage/images/company_img/'.$delFileName);
としてみたのですが、いまだにファイルの削除ができません。。。。
エラーログに何か出ていませんか?
本当にそのパスで合っているかは検証必要です。
ありがとうございます。
画像パスに関しては、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');
}
コントローラーの中に\Log::debugを入れてみました。
logを確認すると、
[2022-09-30 15:19:26] local.DEBUG: company_img_destroy ["20220930_151551_stephen-phillips-hostreviews-co-uk-zs98a0DtKL4-unsplash.jpg"]
とログが出力されています。
storageディレクトリってWebから参照できないはずの場所にあると思います。(その名の通りなので)
storage_path()はどこになっていますか?
storage/app/public/images/company_img に削除したい画像が保存されており、シンボリックでpublic/storage/images/company_img とリンクしております。
(storage_path()はどこになっていますか?に対する回答として勘違いしていないでしょうか?)
なるほどシンボリックリンクしてるわけですね。
いえ、
storage_path()がstorage/を指してればよいなと。
質問本文に記載いただければと。
では
Storage::delete('app/public/images/company_img/'.$delFileName);
もしくは
Storage::delete('images/company_img/'.$delFileName);
とした場合は?
コメントありがとうございます。
Storage::delete('app/public/images/company_img/'.$delFileName);
もしくは
Storage::delete('images/company_img/'.$delFileName);
にしてみても結果変わらず、エラーも起きずそのままリダイレクト先に遷移します....
どこか他に疑ってみるところはあるのでしょうか。。。。。
ご指摘いただいていたようにパスの指定が謝っていました。
他に原因があるのか?と周り道しましたが、以下で無事に削除できるようになりました。
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', '画像を削除しました。');
}
すみません。エラーの有無より実際に削除されているかどうかを確認してもらいたかったのです。。
回答1件
あなたの回答
tips
プレビュー