benallfree / laravel-stapler-images
扩展 laravel-stapler 的 Image 模型。
Requires
- php: >=5.5.0
- codesleeve/laravel-stapler: 1.0.*
- illuminate/support: 5.*
- laravel/framework: 5.*
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名称修复
两个问题
- 如果从包含#(哈希)的URL中获取,它将无法使用正确的文件扩展名,这会导致MIME类型问题。
- 如果URL太长,它将无法写入文件系统。我通过使用较短的名称来修复了这个问题。
curl/open_basedir错误
如果您在使用共享主机,您可能会发现设置了open_basedir并且curl将无法获取URL。为了修复它,我们已包含一个补丁文件在此包中。
rename错误
codesleeve/stapler在处理URL下载和临时文件时会对文件进行重命名。如果您的临时文件存储在不同的卷上,会存在一个已知的PHP问题,这会导致Laravel异常。要解决这个问题,应使用@rename。