[laravel] How to delete file from public folder in laravel 5.1

I want to delete a News from database and when I hit the delete button all data from database deleted but the image is remains in upload folder. So, how do I this to work. thanks


This is my function again but does not delete the image from images/news folder of public directory>

 public function destroy($id) {
    $news = News::findOrFail($id);
    $image_path = app_path("images/news/{$news->photo}");

    if (File::exists($image_path)) {
        //File::delete($image_path);
        unlink($image_path);
    }
    $news->delete();
    return redirect('admin/dashboard')->with('message','??? ??????? ???  ??');
}

This question is related to laravel

The answer is


public function destroy($id) {
    $news = News::findOrFail($id);
    $image_path = app_path("images/news/".$news->photo);

    if(file_exists($image_path)){
        //File::delete($image_path);
        File::delete( $image_path);
    }
    $news->delete();
    return redirect('admin/dashboard')->with('message','??? ??????? ???  ??');
}

Try to use:

unlink('.'.Storage::url($news->photo));

Look the dot and concatenation before the call of facade Storage.


Using PHP unlink() function, will have the file deleted

$path = public_path()."/uploads/".$from_db->image_name;
unlink($path);

The above will delete an image returned by $from_db->image_name located at public/uploads folder


For Delete files from the public folders, we can use the File::delete function into the Laravel. For use File need to use File into the controller OR We can use \File. This consider the root of the file.

// Delete a single file
File::delete($filename);

For delete Multiple files

// Delete multiple files
File::delete($file1, $file2, $file3);

Delete an array of Files

// Delete an array of files
$files = array($file1, $file2);
File::delete($files);

Update working for Laravel 8.x:

Deleting an image for example ->

First of all add the File Facade at the top of the controller:

use Illuminate\Support\Facades\File;

Then use delete function. If the file is in 'public/' you have to specify the path using public_path() function:

File::delete(public_path("images/filename.png"));

First make sure the file exist by building the path

if($request->hasFile('image')){
    $path = storage_path().'/app/public/YOUR_FOLDER/'.$db->image;
      if(File::exists($path)){
          unlink($path);
      }

Try it :Laravel 5.5

public function destroy($id){  
      $data = User::FindOrFail($id);  
      if(file_exists('backend_assets/uploads/userPhoto/'.$data->photo) AND !empty($data->photo)){ 
            unlink('backend_assets/uploads/userPhoto/'.$data->photo);
         } 
            try{

                $data->delete();
                $bug = 0;
            }
            catch(\Exception $e){
                $bug = $e->errorInfo[1];
            } 
            if($bug==0){
                echo "success";
            }else{
                echo 'error';
            }
        }

the easiest way for you to delete the image of the news is using the model event like below and the model delete the image if the news deleted

at first you should import this in top of the model class use Illuminate\Support\Facades\Storage after that in the model class News you should do this

public static function boot(){
    parent::boot();

    static::deleting(function ($news) {
          Storage::disk('public')->delete("{$news->image}");
    })
}

or you can delete the image in your controller with this command

Storage::disk('public')->delete("images/news/{$news->file_name}");

but you should know that the default disk is public but if you create folder in the public folder and put the image on that you should set the folder name before $news->file_name


Two ways to delete the image from public folder without changing laravel filesystems config file or messing with pure php unlink function:

  1. Using the default local storage you need to specify public subfolder:
Storage::delete('public/'.$image_path);
  1. Use public storage directly:
Storage::disk('public')->delete($image_path);

I would suggest second way as the best one.

Hope this help other people.


If you store your image in folder public, try this steps:

For example your image is sample.jpg and your path is public/img/sample.jpg so this codes will delete your image

use Illuminate\Support\Facades\File;
.
.
.


public function deleteImage(){

   $imgWillDelete = public_path() . '/img/sample.jpg';
   File::delete($imgWillDelete);
}

Its a very old thread, but I don't see that the solution is here or the this thread is marked as solved. I have also stuck into the same problem I solved it like this

  $path = public_path('../storage/YOUR_FOLDER_NAME/YOUR_FILE_NAME');
  if (!File::exists($path)) 
  {
    File::delete(public_path('storage/YOUR_FOLDER_NAME/YOUR_FILE_NAME'));
  }

The key is that you need to remove '..' from the delete method. Keep in mind that this goes true if you are using Storage as well, whether you are using Storage of File don't for get to use them like

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use File; // For File
use Storage; // For Storage

Hope that it will help someone.


For delete file from folder you can use unlink and if you want to delete data from database you can use delete() in laravel

Delete file from folder

unlink($image_path);

For delete record from database

$flight = Flight::find(1);

$flight->delete();


First, you should go to config/filesystems.php and set 'root' => public_path() like so:

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => public_path(),
],

Then, you can use Storage::delete($filename);


Follow the steps carefully to get the image first=>

    $img = DB::table('students')->where('id',$id)->first();
    $image_path = $img->photo;
    
    unlink($image_path);
    DB::table('students')->where('id',$id)->delete();

Use the unlink function of php, just pass exact path to your file to unlink function :

unlink($file_path);

Do not forget to create complete path of your file if it is not stored in the DB. e.g

$file_path = app_path().'/images/news/'.$news->photo;

You could use PHP's unlink() method just as @Khan suggested.

But if you want to do it the Laravel way, use the File::delete() method instead.

// Delete a single file

File::delete($filename);

// Delete multiple files

File::delete($file1, $file2, $file3);

// Delete an array of files

$files = array($file1, $file2);
File::delete($files);

And don't forget to add at the top:

use Illuminate\Support\Facades\File; 

This is the way I upload the file and save it into database and public folder and also the method I delete file from database and public folder.
this may help you and student to get complete source code to get the task done.

uploading file
at the first if you save file into database by giving path public_path() once it not need to used in delete method again

public function store_file(Request $request)
{
   if($request->hasFile('file'))
   {
      $fileExtention = $request->file('file')->getClientOriginalExtension();
      $name = time().rand(999,9999).$request->filename.'.'.$fileExtention;
      $filePath = $request->file('file')->move(public_path().'/videos',$name);
      $video = new Video_Model;
      $video->file_path = $filePath;
      $video->filename = $request->filename;
      $video->save();
   }
   return redirect()->back();
} 

deleting file
from database and public folder as you saved

public function delete_file(Request $request)
{
   $file = Video_Model::find($request->id);
   $file_path = $file->file_path;
   if(file_exists($file_path))
   {
      unlink($file_path);
      Video_Model::destroy($request->id);
   }
   return redirect()->back();
}

this method worked for me
First, put the line below at the beginning of your controller:

use File;

below namespace in your php file Second:

 $destinationPath = 'your_path';
 File::delete($destinationPath.'/your_file');

$destinationPath --> the folder inside folder public.