woodman0224
@woodman0224 (林 正)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Laravel Storageのファイルが削除できない

解決したいこと

Storageのpublicに保存されているファイルを、削除したいです。

if ($request->hasFile('logo')) {
    $file = $request->file('logo');
    $path = $file->storeAs("$company_id/logos", $file->getClientOriginalName(), 'public');
    $url = Storage::url($path);
    $old_url = $company->logo_url;
    $company->logo_url = $url;
    if ($url !== $old_url) {
        Storage::disk('public')->delete($old_url);
    }
}

updateされる時の挙動で、リクエストでファイルを取得してきたら、ファイルを保存して、URLを生成します。
新しいURLを挿入する前に、元々DBに保存されているlog_urlの値を変数代入して、その後、新しく生成されたURLをDBのlogo_urlに新しく入れてあげています。
Logに出力して、$urlと$old_urlが違う場合など確認しているのですが、なぜか

Storage::disk('public')->delete($old_url);

この部分が正常に機能してくれません。
DBには、新しくURLが挿入されています、また、新しいURLのファイルもstorageのpublicに保存されていることも確認済みです。元々あった古いファイルの削除だけができていないと言った現状です。
Storageのファイルが削除できないなどで調べても、disk指定をすると解決できるといったような記事しか見つける事ができず、既に指定してあるのでお手上げ状態です。

あと、どんなことを確認すればよろしいでしょうか?
有識者の方、どうぞよろしくお願いいたします🙇‍♂️

補足

シンボリックリンクは当ててます。

php artisan storage:link

また、$urlと$old_urlもログに出力して確認したところ、/storageから始まるURLとなっています。

Log::debug('url', [$url, $old_url]);

出力結果

local.DEBUG: url ["/storage/1/logos/〇〇.jpg","/storage/1/logos/△△.jpg"]
0

1Answer

おそらくですが$old_url変数の値がhttp://~のようなURLになっているのではないでしょうか。
公式ドキュメントには次のようにあります。

localドライバを使用する場合、すべてのファイル操作は、filesystems設定ファイルで定義したrootディレクトリからの相対位置です。

アプリケーションのfilesystems設定ファイルに含まれているpublicディスクは、パブリックに公開してアクセスできるようにするファイルを対象としています。デフォルトでは、publicディスクはlocalドライバを使用し、そのファイルをstorage/app/publicに保存します。

$old_url変数の値を確認し、rootディレクトリからの相対パスになっているか確認してください。
また、単純なコードでストレージ操作について確認し、理解を深めることでこうした問題に対処しやすくなります。

参考

1Like

Comments

  1. @woodman0224

    Questioner

    コメントありがとうございます!
    $old_urlの値はLog::debugで確認しました。

    Log::debug('url', [$url, $old_url]);
    
    // 出力結果
    local.DEBUG: url ["/storage/60/logos/9X3q5uzyJqe6.jpg","/storage/60/logos/9X3q5uzyJqe6.jpg"]
    

    このようにDBに/storageから始まるURLを挿入しているので、/storageから始まるURLが$old_urlのデータとして入っています。

  2. rootディレクトリからの相対パスになっているか、という点についてはいかがですか?

  3. @woodman0224

    Questioner

    すみません、質問の意図がよくわかりません。
    $old_urlの値を確認した結果が"/storage/60/logos/9X3q5uzyJqe6.jpg"ですが、Logで出力する場合とそうではない場合はパスが変わってくるということですか?

  4. では質問を変えて、削除対象のファイルはどこに保存されていますか?
    publicディスクに保存しているのであればstorage/app/public以下になると思いますが、パスはどのようになっているでしょうか?

Your answer might help someone💌