laravel 删除图片的背包

backpack for laravel deleting image

尝试删除图像时,我需要将其从磁盘中完全删除

功能:

public function setUrlAttribute($value)
{  
    $attribute_name = "url";
    $disk = "public";
    $destination_path = "uploads/equipos";

    if ($value==null) {
        // delete the image from disk

       Storage::disk($disk)->delete($this->url);   //<---- fix here
        // set null in the database column
        $this->attributes[$attribute_name] = null;
    }

图片路线: 数据库:

删除图像时,没有任何变化,需要帮助从磁盘中物理删除图像。

TLDR;上传后检查目标文件权限,在删除前也尝试 dump($this->url),以确保使用正确的磁盘路径

示例:

只要你的字段定义正确,backpack 应该能够自动管理一切。比如处理客户端图片,我的字段是这样的:

$this->crud->addField([
  'name' => 'logotipo',
  'label' => "Logotipo del Cliente",
  'type' => 'image',
  'upload' => true,
  'crop' => true,
  'disk' => 'uploads',
  ], 'both');

然后,在模型中

public function setLogotipoAttribute($value)
{
    if ($value==null) {
        if(isset($this->attributes["logo"])) {
            \Storage::disk($this->disk)->delete($this->attributes["logo]);
        }
        return null;
    }
    else
    {
      /* Whatever you need, I just create thumbs with a custom \Utils::thumb, you can mutate the atrribute to your needs */
      $this->attributes["logo"] = \Utils::thumb($this, $value, "logo", "academias/logos", 300, 200, "png");
    }
}

仅此而已,背包搞定一切。

唯一需要注意的是,如果删除模型(在我的示例中删除客户端),您还需要注意自己删除的文件。这可以在模型的 boot 方法中使用 deleting 事件完成。

public static function boot()
{
    parent::boot();
    static::deleting(function($obj) {
        if (isset($obj->logo)) \Storage::disk($obj->disk)->delete($obj->logo);
    });
}

当您将 $disk 和字段 value 传递给它时,它将毫无问题地删除文件,无需指定路径,因为它将包含在 $value