Laravel 5 文件删除错误

Posted

技术标签:

【中文标题】Laravel 5 文件删除错误【英文标题】:Laravel 5 File Delete Error 【发布时间】:2015-12-01 23:08:49 【问题描述】:

有一个与我的 laravel 5 Web 应用程序有关的文件删除问题。

我想从我的表中删除一个带有相应图像文件的条目。 这是我的表结构。

 Schema::create('master_brands',function($table)
        $table->increments('pk_brand_id');
        $table->string('brand_name');
        $table->string('brand_logo');
        $table->timestamps();
    );

我在数据库中添加了 3 个品牌,并将图像路径存储在 brand_logo 字段中,例如:(/uploads/masters/logocatagory_Computers & IT.png)。

从数据库中删除记录时,我还想从上传文件夹中删除图像文件。 但是当我执行删除操作时,文件没有被删除。 这是我的删除控制器。

  public function branddelete($id)
  
    $filename = DB::table('master_brands')->where('pk_brand_id', $id)->get();
    $filname =  url()."/app".$filename[0]->brand_logo;
    File::delete($filname); // http://localhost/genie-works/devojp/app//uploads/masters/logocatagory_Computers & IT.png
  

该文件存在于我的目录中,并且该目录具有 777 权限。 !!

我也试过Storage类删除文件。但是没有办法!!!..

我该如何解决这个问题?任何想法... :(

【问题讨论】:

【参考方案1】:

你做错了。您不可能从 URL 中删除文件,您必须提供文件 PATH 而不是 URL

编辑

假设您要删除的文件位于public/uploads/masters/logocatagory_Computers,您可以这样做:

public function branddelete($id)

    $filename = DB::table('master_brands')->where('pk_brand_id', $id)->get();
    $filname =  $filename[0]->brand_logo; 
    //example it.png, which is located in `public/uploads/masters/logocatagory_Computers` folder
    $file_path = app_path("uploads/masters/logocatagory_Computers/$filname");

    if(File::exists($file_path)) File::delete($file_path); 

【讨论】:

我已经编辑了我的答案。只需将 public_path 替换为 app_path 嗨,伙计,你能分享一下你的邮件ID吗? App\Models\File 未找到异常 在控制器类的顶部尝试use File;,或者试试这个if(\File::exists($file_path)) \File::delete($file_path);【参考方案2】:

如果你有文件 Storage/app/ , Storage:: 不起作用,更改 /Config/Filesystems.php 尝试将你的“本地”放在 base_path() 并注释默认 storage_path(),

    'disks' => [

    'local' => [
        'driver' => 'local',
        'root'   => base_path(),
        // 'root'   => storage_path('app'),
    ],

然后在控制器中

use Illuminate\Support\Facades\Storage;

然后在公共函数中使用存储模型

$path= 'uploads/masters/';
Storage::delete($path . $filname);

【讨论】:

【参考方案3】:

在 Laravel 5.1 中。 使用本地驱动程序时,请注意所有文件操作都相对于配置文件中定义的根目录。默认情况下,此值设置为 storage/app 目录。因此,

以下方法会将文件存储在 storage/app/file.txt 中:

Storage::put('file.txt', 'Contents');

这会删除 storage/app 中的 file.txt

Storage::delete('file.txt');

如果你想改变根目录,以'storage/app/uploads/'为例,你可以设置filesystem.php如下:

'disks' => [

    'local' => [
        'driver' => 'local',
        'root'   => storage_path('app/uploads/'),
    ],
    ...

那么下面这个方法会在 storage/app/uploads/file.txt 中存储一个文件:

Storage::put('file.txt', 'Contents');

这将删除 storage/app/uploads 目录中的 file.txt。

Storage::delete('file.txt');

【讨论】:

【参考方案4】:

今天我花了很长时间才弄清楚的事情:

如果您尝试删除包装在 Laravel 自己的 Collection 包装器中的文件列表,您可能需要调用 ->all() 来获取底层数组实例:

// The following is an example scenario
$files = Storage::list('downloads');

$collection = collect($files)->filter(function ($file) 
  return str_contains($file, 'temp');
);

Storage::delete($collection->all()); // Note the "all()" call here

【讨论】:

以上是关于Laravel 5 文件删除错误的主要内容,如果未能解决你的问题,请参考以下文章

新鲜的 Laravel 安装删除了工匠服务上的 server.php

更改文件夹结构以删除公用文件夹时对 Laravel 5 安全性的影响

我需要清除哪些 Laravel 缓存以删除有关丢失迁移文件的错误?

laravel 5.4 删除引入layer文件的写法

已删除的迁移文件被执行:Laravel 应用程序

Laravel 迁移已删除的文件