adiachenko / pocket
Requires
- php: ^7.0
- illuminate/contracts: ~5.4
- illuminate/database: ~5.4
- illuminate/http: ~5.4
- illuminate/routing: ~5.4
- illuminate/support: ~5.4
- intervention/image: ~2.3
- nesbot/carbon: ^1.22
Requires (Dev)
- guzzlehttp/guzzle: ^6.0
- league/flysystem-aws-s3-v3: ^1.0
- orchestra/testbench: ~3.4
- phpunit/phpunit: ~5.7
Suggests
- league/flysystem-aws-s3-v3: Required to use AWS S3 file storage
This package is auto-updated.
Last update: 2019-01-25 18:26:19 UTC
README
Eloquent😜 文件管理为 Laravel 框架。
目录
要求
- PHP >= 7.0
- Laravel >= 5.4
- (可选)
league/flysystem-aws-s3-v3
安装
要开始使用,请通过 Composer 包管理器安装 Pocket
composer require adiachenko/pocket
在 config/app.php
配置文件的 providers 数组中注册 Pocket 服务提供者
Adiachenko\Pocket\PocketServiceProvider::class,
Pocket 服务提供者将其自己的数据库迁移目录注册到框架中,因此您应该在注册提供者后迁移数据库。迁移将创建应用程序需要存储上传文件引用的表
php artisan migrate
最后,您可以发布 config/pocket.php
文件,其中您可以指定自定义文件引用模型,更改用于存储预签名 URL 的缓存连接,提供用于文件服务(如缓存控制和内容处理)等各种选项等。
php artisan vendor:publish --provider="Adiachenko\Pocket\PocketServiceProvider"
请查看它以了解可用的选项。
启用 Pocket 模型使用
将 Adiachenko\Pocket\Concerns\HasFiles
特性包含到您需要关联文件的 Eloquent 模型中。
<?php
namespace App;
use Adiachenko\Pocket\Concerns\HasFiles;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFiles;
}
基本用法
上传文件并将其附加到指定命名空间(在本例中为 pictures
)下的模型中
/** @var Illuminate\Http\UploadedFile $file */ $model->pocket('pictures')->add($file)->asPublic();
或者,您可以省略 pocket 名称,在这种情况下将假定 default
/** @var Illuminate\Http\UploadedFile $file */ $model->pocket()->add($file)->asPublic();
您可以直接通过请求键添加文件而不是传递上传文件的实例
$model->pocket()->addFromRequest('file')->asPublic();
也可以通过 URL 上传
$model->pocket()->addFromUrl('https://some-media.com/kitten.jpg')->asPublic();
当然,文件可以以私有资产的形式上传,在这种情况下它不会直接通过 URL 访问
/** @var Illuminate\Http\UploadedFile $file */ $model->pocket()->add($file)->asPrivate();
您可以在上传时明确指定文件名
/** @var Illuminate\Http\UploadedFile $file */ $model->pocket()->add($file, 'whatever.txt')->asPublic();
或文件应上传到的磁盘(注意,我们可以使用 AWS S3 选项覆盖默认上传选项)
/** @var Illuminate\Http\UploadedFile $file */ $model->pocket()->add($file)->asPublic('s3', [ 'CacheControl' => 'max-age=604800', 'ContentDisposition' => 'inline' ]);
您可以稍后像这样检索上传文件的引用
/** @var Illuminate\Database\Eloquent\Model $fileRef */ $fileRef = $model->pocket()->collection()->first();
指定 pocket 的所有引用都是 延迟加载 的,所以您不需要过多担心微优化您的调用。
还有一个快捷方式,会在底层为您调用 Illuminate\Database\Eloquent\Collection
实例
/** @var Illuminate\Database\Eloquent\Model $fileRef */ $fileRef = $model->pocket()->first();
对于更高级的数据库操作,如分页或排序结果,我们建议直接查询文件引用对象。
删除文件引用时,相关的文件将自动清除
/** @var Illuminate\Database\Eloquent\Model $fileRef */ $fileRef->delete();
或者您可以一次性清除整个 pocket
$model->pocket('whatever')->clear();
编辑图片
通过这个包提供的 Adiachenko\Pocket\ImageEditor
外观,您可以使用它生成图片变体(例如,缩略图或带水印的图片)。
请参阅示例。
您应该在队列或计划任务中编辑图片,因为这是一种内存密集型操作。
编辑后的图片保存在与相关文件相同的 variants
目录下,可以通过 FileRef
实例上的 variants
属性访问。
当你运行 $fileRef->delete()
时,所有变体和相关数据将被自动清除,所以除非你的用例超出了此处描述的公共 API,你不需要直接管理这些。
生成公共和私有 URL
生成公共 URL 如此简单
/** @var Adiachenko\Pocket\Models\FileRef $fileRef */ $fileRef->getUrl()
URL 可以指向一个 变体,而不是原始文件
/** @var Adiachenko\Pocket\Models\FileRef $fileRef */ $fileRef->getUrl('small')
尽管我们可能在这里提供完整的文件名(例如
small.jpg
),但这不是必需的,在某些情况下甚至是不推荐的(例如,可能允许同时使用jpg
和jpeg
扩展名)。你只需提供足够多的字符以唯一标识变体,我们将猜测其余部分。
如果找不到变体,getUrl
辅助函数将回退到检索原始文件。
要生成私有 URL,指定分钟数作为过期时间
/** @var Adiachenko\Pocket\Models\FileRef $fileRef */ $fileRef->getUrl(5)
文件变体的方法签名将如下所示
/** @var Adiachenko\Pocket\Models\FileRef $fileRef */ $fileRef->getUrl('small', 5)
限制
虽然技术上支持任何 Flysystem 驱动器,但要从一个除 local
或 s3
之外的驱动器提供文件,则需要实现 Adiachenko\Pocket\Channels\Channel
接口的自定义版本。其中之一,一个 channel 负责生成私有资产的预签名 URL。有关更多信息,请参阅配置文件。
如果你计划从 FTP 驱动器而不是使用第三方平台提供服务,你可能需要进一步扩展 Adiachenko\Pocket\Channels\SelfManagedChannel
类。这个类已经内置了一些功能,可以帮助你连接到用于从本地磁盘提供私有文件的现有路由。
目前必须手动重新生成图像变体。