如何从laravel 5.1中的公用文件夹中删除文件

时间:2015-11-21 11:24:16

标签: laravel

我想从数据库中删除新闻,当我点击删除按钮时,数据库中的所有数据都被删除但图像仍保留在上传文件夹中。 那么,我该如何工作呢。 感谢

这是我的功能,但不删除公共目录>

的图像/新闻文件夹中的图像
 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','خبر موفقانه حذف  شد');
}

21 个答案:

答案 0 :(得分:27)

你可以像@Khan建议的那样使用PHP的unlink()方法。

但是如果你想以Laravel的方式去做,请改用File :: delete()方法。

//删除单个文件

File::delete($filename);

//删除多个文件

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

//删除文件数组

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

答案 1 :(得分:16)

使用php的unlink功能,只需将确切路径传递给您的文件即可取消链接功能:

unlink($file_path);

如果文件未存储在数据库中,请不要忘记创建文件的完整路径。 e.g

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

答案 2 :(得分:8)

这种方法对我有用 首先,将下面的行放在控制器的开头:

use File;

在php文件中的命名空间下面 第二:

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

$ destinationPath - >文件夹public里面的文件夹。

答案 3 :(得分:4)

首先,您应该转到config/filesystems.php并设置'root' => public_path(),如下所示:

'disks' => [

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

然后,您可以使用Storage::delete($filename);

答案 4 :(得分:2)

试一试: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';
            }
        }

答案 5 :(得分:2)

这适用于 Laravel 8

use File;

if (File::exists(public_path('uploads/csv/img.png'))) {
     File::delete(public_path('uploads/csv/img.png'));
 }

答案 6 :(得分:1)

使用PHP unlink()函数将删除该文件

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

以上内容将删除位于$from_db->image_name文件夹中的public/uploads返回的图像

答案 7 :(得分:1)

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','خبر موفقانه حذف  شد');
}

答案 8 :(得分:1)

更新适用于Laravel 8.x:

例如删除图像->

首先在控制器顶部添加文件外观:

use Illuminate\Support\Facades\File;

然后使用删除功能。如果文件位于“ public /”中,则必须使用public_path()函数指定路径:

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

答案 9 :(得分:1)

这是我上传文件并将其保存到数据库和公用文件夹中的方法,也是我从数据库和公用文件夹中删除文件的方法。
这可以帮助您和学生获得完整的源代码来完成任务。

上传文件
首先,如果您无需再通过delete方法使用路径public_path()即可将文件保存到数据库中

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();
} 

删除文件
保存时从数据库和公用文件夹中访问

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();
}

答案 10 :(得分:0)

您可以明智地删除文件及其记录:

 public function destroy($id)
    {

        $items = Reports::find($id); //Reports is my model
      


    $file_path = public_path('pdf_uploads').'/'.$items->file; // if your file is in some folder in public directory.


  // $file_path = public_path().'/'.$items->file;  use incase you didn't store your files in any folder inside public folder.

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

        File::delete($file_path); //for deleting only file try this
        $items->delete(); //for deleting record and file try both

        }

     return redirect()->back()->with('message','client code: '.$items->receipt_no.'  report details has been successfully deleted along with files');


    }

注意items->file 是我在数据库中的属性,我在其中存储了文件名,如下所示, enter image description here

我已将文件存储在目录“public/pdf_uploads/filename”

不要忘记在标题中添加此内容

use Illuminate\Support\Facades\File; 

答案 11 :(得分:0)

public function update(Request $request, $id)
{
    $article = Article::find($id);
    if($request->hasFile('image')) {
        $oldImage = public_path($article->image);
        File::delete($oldImage);
        $fileName = time().'.'.$request->image->extension();
        $request->image->move(public_path('uploads/'), $fileName);
        $image ='uploads/'.$fileName;
        $article->update([
            'image' => $image,
        ]);
    }
    $article->update([
        'title' => $request->title,
        'description' => $request->description,
    ]);
    return redirect()->route('admin.article.index');
}

答案 12 :(得分:0)

对于从文件夹中删除文件,您可以使用 unlink,如果您想从数据库中删除数据,您可以在 laravel 中使用 delete()

从文件夹中删除文件

unlink($image_path);

用于从数据库中删除记录

$flight = Flight::find(1);

$flight->delete();

答案 13 :(得分:0)

它是一个非常旧的线程,但是我看不到解决方案在这里,或者此线程被标记为已解决。我也陷入了我像这样解决的同样问题

  $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'));
  }

关键是您需要从删除方法中删除“ ..”。请记住,如果您也正在使用存储,那么这是正确的,无论您是否正在使用文件存储,都不要像这样使用它们

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

希望它将对某人有所帮助。

答案 14 :(得分:0)

仔细按照步骤操作,首先获取图像=>

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

答案 15 :(得分:0)

对于从公用文件夹中删除文件,我们可以在Laravel中使用File::delete函数。要使用File,需要将use File插入控制器,或者我们可以使用\File。这考虑了文件的根。

// 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);

答案 16 :(得分:0)

如果将图像存储在 public 文件夹中,请尝试以下步骤:

例如,您的图片是 sample.jpg ,而您的路径是 public / img / sample.jpg 因此此代码将删除您的图片

readFile

答案 17 :(得分:0)

首先通过构建路径确保文件存在

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

答案 18 :(得分:0)

删除新闻图片最简单的方法是使用如下所示的模型事件 如果新闻已删除,模型会删除图片

首先,您应该将其导入模型类use Illuminate\Support\Facades\Storage的顶部 之后,在模型类News中,您应该这样做

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

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

或者您可以使用以下命令删除控制器中的图像 该命令

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

但是您应该知道默认磁盘是公用磁盘,但是如果您在公用文件夹中创建文件夹并放置映像,则应在$news->file_name之前设置文件夹名称

答案 19 :(得分:0)

尝试使用: 取消关联(存储:: URL($新闻 - &GT '';照片));

在de call o facade Storage之前查看点和连接。

答案 20 :(得分:-2)

从公用文件夹中删除图像的两种方法,无需更改laravel文件系统配置文件或使用纯php unlink函数搞乱:

  
      
  1. 使用默认本地存储,您需要指定公共子文件夹:
  2.   
Storage::delete('public/'.$image_path);
  
      
  1. 直接使用公共存储:
  2.   
Storage::disk('public')->delete($image_path);

我建议第二种方式作为最佳方式。

希望这有助于其他人。