【问题标题】:How to change image directory in spatie media library?如何更改 spatie 媒体库中的图像目录?
【发布时间】:2020-09-11 12:51:40
【问题描述】:

我是这个包的新手,因为我通常使用图像干预。所以问题是每当我保存图像时,它都会保存在存储目录而不是公共目录中。我试图查看文档并进行了一些研究,但没有看到任何答案。请参阅下面的代码以进行保存。

$user->addMediaFromRequest('avatar')->toMediaCollection('avatars');

包装:

https://spatie.be/docs/laravel-medialibrary/v7/introduction

【问题讨论】:

  • 你需要让你自己的类扩展默认的 PathGenerator,阅读spatie.be/docs/laravel-medialibrary/v7/advanced-usage/… 部分
  • @AlzafanChristian 你能添加一个例子和更多细节吗?文档有点混乱。
  • @Jonjie 我不建议将图像保存在/public 目录中,而是将它们保存在storage/app/public 目录中并创建从public/storagestorage/app/public 的符号链接,如@987654323 所述@.
  • @Remul 感谢您的推荐。但是我可以知道原因吗?

标签: laravel laravel-medialibrary


【解决方案1】:

您可以简单地使用$user->addMediaFromRequest('avatar')->toMediaCollection('avatars', 'disk'); 定义文件系统配置

这是我如何使用这个包(简单用法),如果你以后需要它

在我的模型上:

use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Spatie\MediaLibrary\Models\Media;
class User extends Model implements HasMedia
{
use HasMediaTrait;
public function registerMediaCollections()
{
    $this
    ->addMediaCollection('avatar')
    ->singleFile()
    ->useDisk('public');
    ->useFallbackUrl(asset('/images/default-user.png'))
    ->useFallbackPath(public_path('/images/default-user.png'));
}

public function registerMediaConversions(Media $media = null)
{
    $this->addMediaConversion('avatar-thumb')->width(120)->height(120);
}
...

要使用模型访问器获取文件 url,请在我的模型中添加此功能:

public function getAvatarAttribute()
{
    $file = $this->getMedia('avatar')->first();

    if($file) {
      $file->url = $file->getUrl();
      $file->thumbnail = $file->getUrl('avatar-thumb'));
      $file->alternate = $file->getCustomProperty('alternate') ?: $file->file_name;
    }else{
      $file = new \StdClass;
      $file->url = $this->getFallbackMediaUrl('avatar');
      $file->thumbnail = public_path('/images/default-user-thumb.png');
      $file->alternate = 'avatar.png';
    }

    return $file;
}

同样使用自定义路径,在 config\medialibrary.php 中设置这个数组'path_generator' => Path\To\Your\Class::class,

然后是班级:

use Spatie\MediaLibrary\Models\Media;
use Spatie\MediaLibrary\PathGenerator\PathGenerator as PathGenerators;

class PathGenerator implements PathGenerators
{
public function getPath(Media $media): string
{
    return $this->getBasePath($media).'/';
}

public function getPathForConversions(Media $media): string
{
    return $this->getBasePath($media).'/conversions/';
}

public function getPathForResponsiveImages(Media $media): string
{
    return $this->getBasePath($media).'/responsive-images/';
}

protected function getBasePath(Media $media): string
{
    //here im using trait to generate default path, e.g: path/mimes/avatar/media->id
    //its up to you to define folder structure, just make sure each folder
    //for conversions has unique name, or else it will be deleted
    $base_folder = $this->get_base_folder($media->mime_type);
    return "{$base_folder}/{$media->collection_name}/{$media->getKey()}";
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2019-02-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多