【问题标题】:Laravel unlink methodLaravel 取消链接方法
【发布时间】:2020-07-06 19:30:41
【问题描述】:

有人可以告诉我如何在产品被删除时从公共路径中取消链接。

我当前的代码不起作用:

public function destroy($id)
    {
        $product = Product::findOrFail($id);
        $image_path = '/uploads/products/' . $product->image;
        
        if(file_exists($image_path)){
            unlink($image_path);
        }

        $product->delete();
    }

也试过了:

$product = Product::findOrFail($id);

        if(file_exists($product->image)){
            unlink($product->image);
        }

        $product->delete();

我也在使用访问器,所以我的 $product->image 正在返回:

"http://myeshop.local/uploads/products/1593902362bluesocksupd.jpg"

这里是访问代码:

public function getImageAttribute($image){
    return asset($image);
}

【问题讨论】:

  • 我认为你应该看看这个答案stackoverflow.com/questions/33842735/…
  • unlink() 必须删除指定的文件。但是您没有提供文件的绝对路径。因此,您必须为要删除的文件提供绝对路径。
  • 不,应该但绝对不能。所有权、权限等
  • 哦! SeadSilajdzic MarcinOrlowski 在这个意义上绝对是正确的。

标签: laravel


【解决方案1】:

使用模型删除事件

//Product Model

protected static function boot()
{
     parent::boot();
    
     static::deleted(function($product){
        // getOriginal skip accessor
        $image = public_path('uploads/products/' . $product->getOriginal('image'));
        if(file_exists($image)) {
             unlink($image);
        }
    
     });
}

【讨论】:

【解决方案2】:

unlink($path) 是一个 PHP 函数。它将删除位于本地路径的文件。根据您的问题, $product->image 的值是图像的完整 URL。如果是,则以下情况为真:

$product = Product::findOrFail($id);
$image_path = '/uploads/products/' . $product->image;

// $image_path = '/uploads/products/http://myeshop.local/uploads/products/1593902362bluesocksupd.jpg'
// and it needs to point to '/PATH/TO/LARAVEL/uploads/products/1593902362bluesocksupd.jpg'
// the following file_exists() will return false

if(file_exists($image_path)){
   unlink($image_path); // so you never get here
}

有一些快速而肮脏的方法可以解决这个问题,但最好的办法是让$product->image 属性指向文件名。然后在您的视图中将文件名应用到 Web 服务器上的 /uploads/products/ 目录。

这样做可以让您应用/uploads/products/ 本地路径,并有更好的时间找到您要删除的文件。我假设上传目录在你的 Laravel public 目录中,所以你想做这样的事情:

// $product->image must point to the filename only: 1593902362bluesocksupd.jpg
// The file_exists should evaluate to true and unlink() will work.

$image_path = public_path('uploads/products/' . $product->image);

if(file_exists($image_path)){
   unlink($image_path);
}

在您的 Blade 模板视图中,您需要使用以下方式显示产品图片:

<img src="{{ url('/uploads/products/' . $product->image) }}" />

如果您想开发另一个网站或在另一个项目中重复使用此代码,那么在您的数据库中存储一个完整的 URL 并不能很好地扩展。这样你就可以让 Laravel 管理 URL 或本地文件系统的位置。

【讨论】:

    【解决方案3】:

    您可以使用 PHP 的 unlink() 方法。
    但如果你想用 Laravel 的方式来做,请改用Storage::delete 方法:

    use Illuminate\Support\Facades\Storage;
    public function destroy($id)
        {
            $product = Product::findOrFail($id);
            $image_path =   public_path('uploads/products/' . $product->image);
            
            if(file_exists($image_path)){
                Storage::delete($image_path);
            }
    
            $product->delete();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多