【问题标题】:delete previous photo in updating profile photo in Laravel 5.8在 Laravel 5.8 中更新个人资料照片时删除以前的照片
【发布时间】:2019-09-02 18:00:43
【问题描述】:

如何在上传新照片的同时删除之前的照片?

这是我的更新头像功能

public function update_avatar(Request $request){

    $request->validate([
        'avatar' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
    ]);

    $user = Auth::User();

    $avatarName = $user->id.'_avatar'.'.'.request()->avatar->getClientOriginalExtension();

    $request->avatar->storeAs('avatars',$avatarName);

    $user->avatar = $avatarName;
    $user->save();

    return back()
        ->with('success','You have successfully upload image.');
}

编辑:

我将照片存储在 STORAGE > APP > PUBLIC >AVATARS

此代码的作用是,它只会覆盖上一张照片。例如,我有我当前的2_avartar.jpg,如果我用 PNG 扩展文件更新我的照片,2_avartar.jpg 在添加2_avartar.jpg.png 时仍将保留。如果我再次更新 GIF 文件,2_avartar.jpg2_avartar.png 将保留并添加新的 2_avartar.gif。如果您在更新照片之前上传与您所拥有的相同的扩展名,则没有问题。我正在寻找的解决方案是在添加新照片之前删除所有 2_avatar.*。

提前致谢!

【问题讨论】:

    标签: laravel upload photo


    【解决方案1】:

    如果你是昨天向我推荐这个的朋友,请再次发布。 这是我的错误,我没有检查文件夹名称。

        $folder = 'avatar';
        Storage::delete($folder.'/'.$user->avatar); 
    

    再次回答不是我的,昨天回答的已经被删除,因为我认为它不起作用。

    【讨论】:

    • 为什么这不起作用?如果它已经知道文件名,那肯定可以工作?
    • 啊,我现在可以看到了。 $folder 值应该是 'avatars' 。如果你是昨天提出这个答案的朋友,请 $folder = 'avatar';存储::delete($folder.'/'.$user->avatar);再次发布您的问题。这是我的错。我没有检查文件夹名称。
    【解决方案2】:

    你可以试试这个:

    public function update_avatar(Request $request)
    {
        $folder = 'avatars';
    
        $request->validate([
            'avatar' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        ]);
    
        $user = Auth::User();
    
        if ($user->avatar) {
            Storage::delete($folder . '/' . $user->avatar);
            $user->avatar = null;
            $user->save();
        }
    
        $avatarName = $user->id . '_avatar' . '.'
         . request()->avatar->getClientOriginalExtension();
    
        $request->avatar->storeAs($folder, $avatarName);
    
        $user->avatar = $avatarName;
        $user->save();
    
        return back()
            ->with('success','You have successfully upload image.');
    }
    

    NB 保存用户两次的原因是为了防止文件存储出现问题,这样用户就不会留下指向已删除图像的链接作为他们的头像。

    【讨论】:

      【解决方案3】:

      您只需将其与存储它的公用文件夹取消链接即可。

       unlink(public_path('/images/profilepics/'.$sortImageName));
      

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 2018-12-18
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        • 2018-01-28
        • 2023-03-22
        • 1970-01-01
        • 2021-07-24
        相关资源
        最近更新 更多