Как удалить изображение из хранилища в laravel? - PullRequest
0 голосов
/ 20 февраля 2020

В настоящее время я пытаюсь удалить изображение, когда пользователь обновляет свой пост перед публикацией.

Все работает нормально, изображение изменяется в базе данных и на странице поста, но я хочу удалить предыдущий image.

Вот мой контроллер

public function updatePost(Request $request){
    $data = $request->all();
    $postid = $request['id'];
    $isExist = Post::where('id', $postid)->first();
    if($isExist){
        if ($request->hasFile('image')) {

            $file = $request->File('image');
            //Get filename with extension
            $fileNameToStoreWithExt = $file[0]->getClientOriginalName();
            //Get just filename
            $filename = pathinfo($fileNameToStoreWithExt, PATHINFO_FILENAME);
            //Get just ext
            $extension = $file[0]->getClientOriginalExtension();
            //File to store
            $fileNameToStore = $filename . '_' . time() . '.' . $extension;
            //Upload Image
            $path = $file[0]->storeAs('image', $fileNameToStore);
            $file[0]->move('storage/image', $fileNameToStore);
            File::delete(public_path('storage/image'.$isExist['image']));
            Post::where('id', $postid)->update([
                'title' => $data['title'],
                'category' => $data['category'],
                'content' => $data['content'],
                'image' => $path
            ]);
            return response()->json([
                'status'=>'200',
                'response'=> 'successfully updated'
            ]);
        }else{
            Post::where('id', $postid)->update([
                'title' => $data['title'],
                'category' => $data['category'],
                'content' => $data['content']
            ]);
            return response()->json([
                'status'=>'200',
                'response'=> 'successfully updated'
            ]);
        }
    }else{
        return response()->json([
            'error'=> 'post does not exist'
        ]);
    }
}

Я использовал:

File :: delete (public_path ('storage / image'. $ isExist [' образ']));

но это не помогло

моя функция удаления

       public function deletePost($id){
        $post = Post::where('id',$id)->first();
//        dd($post);
        if(!$post){
            return response()->json([
                'status' => '500',
                'error' => 'post not found'
            ]);
        }
        Storage::disk('public')->delete('/storage/image'. $post['image']);
        Post::where('id', $id)->delete();
        return response()->json([
            'status'=> '200',
            'response'=> 'Post successfully deleted'
        ]);
    }

мой снимок пути хранения enter image description here

Ответы [ 5 ]

1 голос
/ 21 февраля 2020

легко сделать оператор if и удалить старое изображение при обновлении! этот код является примером редактирования его в соответствии с вашими требованиями.

if ($request->hasFile('file')) {
    Storage::delete($myImage->file); // If $file is path to old image

    $myImage->file= $request->file('file')->store('name-of-folder');
}

Другой:

File::delete(public_path('images/'. $oldFilename));

см. здесь: https://laracasts.com/discuss/channels/laravel/delete-old-image-from-public-folder-after-updating

1 голос
/ 20 февраля 2020
use Illuminate\Support\Facades\Storage;

Storage::delete('file.jpg'); // delete file from default disk

Storage::delete(['file.jpg', 'file2.jpg']); // delete multiple files         

Storage::disk('your_disk')->delete('file.jpg'); // delete file from specific disk e.g; s3, local etc

См. Ссылку https://laravel.com/docs/6.x/filesystem

0 голосов
/ 20 февраля 2020

Вы можете использовать обычное PHP ключевое слово delete file @ unlink

if (file_exists($image)) {
  @unlink($image);
}
0 голосов
/ 20 февраля 2020

Если вы посмотрите на laravel файловую систему документацию , вы увидите, что существует поддержка нескольких дисков laravel. вы можете использовать Storage Facades для удаления файла из Storage, как этот

use Illuminate\Support\Facades\Storage;
Storage::disk('local')->delete('folder_path/file_name.jpg');

путь должен быть таким же, как для publi c directory.

 Storage::disk('local')->delete('public/image/'.$filename);
0 голосов
/ 20 февраля 2020

Вы можете использовать File для удаления файла из указанного c пути

 $file= "image path here";
 \File::delete($file);

Удалить загруженный файл из публикации c dir

ИЛИ

Вы можете использовать unlink для того же

$image_path = "image path here"; 

 if (file_exists($image_path)) {

       @unlink($image_path);

   }

PHP -> unlink

...