benallfree/laravel-stapler-images

扩展 laravel-stapler 的 Image 模型。

2.2.0 2017-09-21 17:40 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:10:15 UTC


README

这个 Laravel 5 包基于 codesleeve/laravel-stapler 构建,并采用不同的附件存储方法,通过在单个表中存储附件。除了这种规范的附件存储方法之外,它还处理图像和图像大小。

将附件存储在单个表中有几个好处

  • 更易于维护 - 添加新附件时无需额外的迁移
  • 处理附件的实用工具和 Laravel 命令无需知道特定的列名
  • 规范化的数据更有组织,易于搜索
  • 避免图像重复

设置

安装

composer require benallfree/laravel-stapler-images

将服务提供者添加到 config/app.php

BenAllfree\LaravelStaplerImages\LaravelStaplerImagesServiceProvider::class,
Codesleeve\LaravelStapler\Providers\L5ServiceProvider::class,

可选地,在 config/app.php 中为 \Image\Attachment 类添加别名

'Image' => BenAllfree\LaravelStaplerImages\Image::class,
'Attachment' => BenAllfree\LaravelStaplerImages\Attachment::class,

发布配置

php artisan vendor:publish

查看 config/laravel-stapler 中的配置文件。如果您不熟悉配置文件,请参阅 基本的 Stapler 配置文档。我在其中添加了 images.php,您可以在其中控制此包的设置。特别是,如果您想调整表名和创建的图像大小,您可以在那里进行设置。

我喜欢 config/laravel-stapler/filesystem.php 中的这个设置

'url' => '/i/:id_partition/:style/:filename',

别忘了迁移

php artisan migrate

基本用法

非常简单。让我们给 User 模型添加一个头像。

首先,创建一个迁移。在这种情况下,让我们做一个简单的 belongsTo 关联。

Schema::table('users', function (Blueprint $table) {
  $table->integer('avatar_image_id');
});

我将其命名为 avatar_image_id,因为我们想将字段视为一个 BenAllfree\LaravelStaplerImages\Image 对象,以便进行图像处理。这为我们提供了处理各种图像大小的额外功能。如果我们不需要这些功能,我们可以将其命名为 avatar_file_id,它将是一个 BenAllfree\LaravelStaplerImages\Attachment

现在,将其添加到用户表中

use BenAllfree\LaravelStaplerImages\AttachmentTrait;

class User
{
  use AttachmentTrait;
}

太棒了。现在我们可以开始操作了。保存将立即生成并保存所有图像。

// Create an image
$url = "http://www.gravatar.com/avatar/71137e6e1c94b72f162da3262b700017.png";
$user->avatar_image_path = $url;
$user->save();

$url 也可以是一个文件路径。

接下来,我们可以调用已处理的图像 URL。这些的 MIME 类型始终为 image/jpg

// Use an image
echo $user->avatar_image->url('thumb');

默认存在以下大小

'large' => '640x640#',
'featured' => '585x585#',
'medium' => '400x400#',
'thumb' => '180x180#',
'admin' => '100x100#',
'tiny' => '75x75#',

表单和输入

给定一个名为 avatar_image 的字段...

在视图中

{!! Form::open(['method'=>'post', 'files'=>true]) !!}
{!! Form::file('avatar_image') !!}
{!! Form::submit('Update') !!}
{!! Form ::close() !!}

在控制器中

function do_postback(Request $r)
{
  $u = Auth::user();
  $u->update($r->input());
  $u->update($r->files()); // This is the important one
}

魔术获取器和设置器

给定一个数据库字段 <name>_file_id

<name>_file - 一个获取器,返回一个针对给定基础 ID 的 Attachment 对象;<name>_file_path() - 一个接受文件路径或 URL 的设置器转换器,并从中创建一个 Attachment 对象。如果它找不到指定路径的文件,它将在 la_path 配置设置中查找,然后在 la_path() 中查找,然后在 root_path() 中查找。

同样,数据库字段 <name>_image_id 将对 Image 执行相同的操作,但在创建对象时将添加图像处理。

<name>_image - 一个获取器,返回给定基本ID的Image对象 <name>_image_path() - 一个接受文件路径或URL并从中创建Attachment对象的设置器变体器。如果它找不到指定路径的文件,它将检查la_path配置设置,然后检查la_path(),最后检查root_path()

Image不是Attachment的子类,因此这些不应该互换使用。

缓存和性能

默认情况下,Image::from_url($url)将检查$url与图像表中original_file_name列的匹配,并且仅在第一次需要时获取图像。如果您想强制这样做,请使用from_url($url, true)

自定义图像大小

没问题,只需进入config/laravel-stapler-images.php并创建您想要的任何大小。

重新处理图像

如果您更改了图像的大小,您将需要重新处理现有图像。

php artisan images:reprocess

保护图像

如果您想从安全路由中而不是直接从public文件夹提供图像,请进行以下修改

创建以下文件

/storage/uploads/.gitkeep

config/laravel-stapler/filesystem.php中更改图像存储位置(在webroot之外)

'path' => ':app_root/storage/uploads:url',

然后,创建如下路由,并添加您需要的任何安全设置

Route::get('/images/{id}/{size}', function($id,$size) {
  $image = \Image::find($id);
  if(!$image)
  {
    App::abort(404);
  }

  $response = Response::make(
     File::get($image->image->path($size)), 
     200
  );
  $response->header(
    'Content-type',
    'image/jpeg'
  );
  return $response;
});

高级使用(直接与附件工作)

如果您有一个枢纽表或需要直接与附件工作的其他需求

$image = Image::from_url($url);
$att = Attachment::from_url($url);

与Laravel Administrator集成

您像我一样喜欢Laravel Administrator吗?太棒了。以下是您如何操作。

首先,熟悉Laravel Administrator中上传字段的[location](http://administrator.frozennode.com/docs/field-type-image)属性。

步骤1:选择一个Laravel Administrator将上传文件的位置。

config/laravel-stapler/images.php中,有一个可配置的la_path。默认值是好的,但如果您想更改它,可以这样做。请为Laravel Administrator中的所有模型使用相同的位置。Laravel Stapler Images将在此配置路径中查找任何要保存的上传。我建议在此路径中添加一个.gitkeep

步骤2:配置您的Laravel Administrator模型,注意使用步骤1中选择的config()路径。

按照以下方式配置config/administrator/<your model>.php

<?php

return array(
  
  'title' => 'Users',
  
  'single' => 'User',
  
  'model' => 'App\User',
  
  /**
   * The display columns
   */
  'columns' => array(
    'id',
    'avatar_image_id' => array(
      'title' => 'Avatar',
      'output'=>function($id) {
        if(!$id) return '';
        $i = \Image::find($id);
        return "<img src='{$i->url('admin')}?r={$i->updated_at->timestamp}' width=50/>";
      },
    ),    
  ),
  
  /**
   * The editable fields
   */
  'edit_fields' => array(
    'avatar_image_la'=>[
      'title'=>'Avatar',
      'type'=>'image',
      'location'=>config('laravel-stapler.images.la_path').'/',
    ]
    
  ),
  
);

步骤3:通过$appends向Eloquent模型添加额外的JSON属性。

回想一下我们上面的用户模型包含一个avatar_image_id字段,并且我们可以使用$user->avatar_image来访问它。

class User
{
  use AttachmentTrait;
}

为了确保Laravel Administrator可以看到它,我们必须稍微修改一下模型

class User
{
  use AttachmentTrait;
  
  protected $appends = ['avatar_image_la'];
}

_la后缀表示这是一个Laravel Administrator文件附件字段。

就这样!现在您有了来自Laravel Administrator的图像!

解决方案和错误修复

核心codesleeve/stapler包有几个可能对您很重要的错误。要使用修复了错误的我的Stapler分支版本,请执行以下操作

在您的composer.json中

"repositories": [
  {
      "type": "vcs",
      "url": "git@github.com:benallfree/stapler.git"
  }
"require": {
    "codesleeve/stapler": "dev-master as 1.2.0",
},

哈希和长URL名称修复

两个问题

  1. 如果从包含#(哈希)的URL中获取,它将无法使用正确的文件扩展名,这会导致MIME类型问题。
  2. 如果URL太长,它将无法写入文件系统。我通过使用较短的名称来修复了这个问题。

curl/open_basedir错误

如果您在使用共享主机,您可能会发现设置了open_basedir并且curl将无法获取URL。为了修复它,我们已包含一个补丁文件在此包中。

rename错误

codesleeve/stapler在处理URL下载和临时文件时会对文件进行重命名。如果您的临时文件存储在不同的卷上,会存在一个已知的PHP问题,这会导致Laravel异常。要解决这个问题,应使用@rename