为了账号安全,请及时绑定邮箱和手机立即绑定

图像更新并删除 Laravel 上的旧图像

图像更新并删除 Laravel 上的旧图像

PHP
慕尼黑的夜晚无繁华 2021-12-24 10:27:22
尝试在我的更新控制器中实现更新文章似乎有效,但问题是当我只想更新帖子而不上传旧图像时,旧图像总是被删除,这是不应该的。这是我的商店功能public function store(Post $post){        $post->update($this->validateRequest());        $this->storeImage($post);        return redirect('post/'.$post->id)->with('success', 'New ariticle has been posted');    }} 这是我的验证private function validateRequest()    {        return request()->validate([            'title'=> 'required',            'content' => 'required',            'image' => 'sometimes|image|max:5000',        ]);    }这是我的更新功能public function update(Post $post){        File::delete(public_path('storage/'.$post->image));         $post->update($this->validateRequest());        $this->storeImage($post);        return redirect('post/'.$post->id)->with('success', 'This post has         been Edited');    }} 我试图添加File::delete到我的 storeImage 函数并从我的更新函数中删除它,它解决了问题,但旧图像没有从目录中删除private function storeImage($post){  if (request()->has('image')){  File::delete(public_path('storage/'.$post->image))  $post->update([       'image' => request()->image->store('uploads', 'public'),  ]);  $image = Image::make(public_path('storage/'.$post->image))->fit(750, 300);  $image->save();        }    }好的,因为我在控制器中使用模型绑定,所以我不必找到 id 对吗?所以我改变了我的更新功能,基本上是 Akhtar munir 建议的,结果是这样的。图像更新工作,它也会在我更新时删除旧图像。但是我发现了另一个问题,问题是当我编辑文章和标题时它没有像我更新时那样改变,我希望你能看看这是正确的吗?public function update(Post $post){    $this->validateRequest();    if(request()->hasFile('image') && request('image') != ''){            $imagePath = public_path('storage/'.$post->image);            if(File::exists($imagePath)){                unlink($imagePath);            }            $image = request()->file('image')->store('uploads', 'public');            $post->update([                'title' => request()->title,                'content' => request()->content,                'image' => $image,            ]);        }}
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

这是我在我的方法之一中所做的。它可能会帮助你。


public function update(Request $request, $id)

{

    if (UserDocument::where('id',$id)->exists()) {


        $this->validateUserDocument($request);

        

        if ($request->hasFile('doc_file') && $request->doc_file != '') {

            

            $doc = UserDocument::where('id',$id)->first();

            // dd($doc);

            $file_path = storage_path().'/app/'.$doc['doc_file'];

            //You can also check existance of the file in storage.

            if(Storage::exists($file_path)) {

               unlink($file_path); //delete from storage

               // Storage::delete($file_path); //Or you can do it as well

            }


            $file = $request->file('doc_file')->store('documents'); //new file path


            $doc->update([

                'title' => $request->title,

                'doc_file' => $file //new file path updated

            ]);


            session()->flash('success','Document updated successfully!');

            return redirect()->route('userdocs');

        }


        session()->flash('error','Empty file can not be updated!');

        return redirect()->back();

    }

    session()->flash('error','Record not found!');

    return redirect()->back();

}

在这段代码中,我只是想向您说明我已将图像路径存储在数据库中,首先我检索了该路径,并使用该路径在本地存储中找到了图像,首先将其删除,然后使用新的更新一。但是请确保在两种情况下都使用插入和更新将图像路径存储在数据库中。


所以最后你也可以像这样优化你的代码,它会像你期望的那样做同样的事情,无论是图像和所有数据还是只有标题和内容。


public function update(Post $post){

    $this->validateRequest();

    $data = [

        'title' => request()->title,

        'content' => request()->content

    ];

    if (request()->hasFile('image') && request('image') != '') {

        $imagePath = public_path('storage/'.$post->image);

        if(File::exists($imagePath)){

            unlink($imagePath);

        }

        $image = request()->file('image')->store('uploads', 'public');

        $data['image'] = $image;

        //$post->update($data);

    }

    $post->update($data);

}


查看完整回答
反对 回复 2021-12-24
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

试试这个


private function storeImage($post)

{


    if (request()->hasFile('image')){

        $image_path = "/storage/".'prev_img_name';  // prev image path

        if(File::exists($image_path)) {

            File::delete($image_path);

        }

        $post->update([

           'image' => request()->image->store('uploads', 'public'),

        ]);


        $image = Image::make(public_path('storage/'.$post->image))->fit(750, 300);

        $image->save();

    }

}


查看完整回答
反对 回复 2021-12-24
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信