chialab / cakephp-object-storage
CakePHP应用程序的对象存储插件
Requires
- php: >=8.1
- cakephp/cakephp: ^4.3
- cakephp/migrations: ^3.0
- chialab/object-storage: v0.1.0
- webmozart/assert: ^1.11
Requires (Dev)
- cakedc/cakephp-phpstan: ^2.0
- cakephp/cakephp-codesniffer: ^5.1
- guzzlehttp/psr7: ^2.5
- phpstan/extension-installer: ^1.2
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-09-04 08:10:08 UTC
README
此插件为CakePHP应用程序提供了一个对象存储实现。
特性
此插件提供以下功能:
- 迁移以创建
files
表 - 为
Files
模型提供实体和表类 - REST控制器
- 默认路由
- 使用CakePHP的服务容器提供存储服务的服务提供者
- 事件监听器,用于在初始化时向表实例注入服务容器
- 无模式表单来处理文件操作
- shell命令来清理不完整的分片上传
安装
您可以使用composer安装此插件
composer install chialab/cakephp-object-storage
要使用AWS S3作为后端存储,还需要SDK
composer install aws/aws-sdk-php
使用方法
在您的Application.php
引导中添加插件
public function bootstrap(): void { // ... $this->addPlugin('Chialab/CakeObjectStorage'); // ... }
运行迁移以创建files
表
bin/cake migrations migrate --plugin Chialab/CakeObjectStorage
在您的app.php
中添加后端存储的配置
// ... 'Storage' => [ 'className' => FilesystemAdapter::class, 'args' => [ WWW_ROOT . 'files' . DS, TMP . 'incomplete-uploads' . DS, '/files/', 0007, ], ], // ...
有关适配器的更多信息,请参阅chialab/php-object-storage
库的README
禁用路由
在添加插件时使用['routes' => false]
以实现自己的路由。如果您只想更改路径,则仍可以使用Chialab/CakeObjectStorage.Files
作为控制器,或者实现自己的控制器。
禁用事件监听器
在添加插件时使用['bootstrap' => false]
以禁用自动添加事件监听器。如果您正在使用插件的FilesTable
,则需要将DI容器设置为其实例,或者实现自己的服务处理。
禁用服务提供者
在添加插件时使用['services' => false]
以禁用自动添加存储服务提供者。您需要为FilesTable
实例提供MultipartUploadInterface
实现,或者实现自己的服务处理。
上传
有关小文件和多部分上传之间的阈值,请参阅File::getMultipartChunkSize()
创建文件实体
默认控制器接受以下请求
POST /files
{
"filename": "example.jpg",
"mime_type": "image/jpg",
"size": 20480 // 20 MiB
}
响应如下
{ "file": { "filename": "example.jpg", "mime_type": "image/jpg", "size": 20480, // 20 MiB "created": "2023-05-08T15:58:27+00:00", "id": "076e11d0-4ba6-4680-8796-ee232eeca090", "is_multipart": true, "is_finalized": false, "url": null }, "chunk_size": 10485760, // 10 MiB, present only if `is_multipart === true` "upload": "http://ossma.localhost/api/v1/files/076e11d0-4ba6-4680-8796-ee232eeca090/upload", "finalize": "http://ossma.localhost/api/v1/files/076e11d0-4ba6-4680-8796-ee232eeca090/finalize" // present only if `is_multipart === true` }
响应中的文件实体具有一个is_multipart
属性,以让客户端知道是否需要多部分上传。在这种情况下,响应还将包含一个chunk_size
属性,其中包含最大文件部分大小,以及一个在所有部分都已上传后调用的finalize
URL。
上传文件
要上传文件,请使用以下请求体发送文件
POST /files/{file_id}/upload
多部分上传
要上传多部分上传的一部分,请向请求添加part
查询参数
POST /files/{file_id}/upload?part=1
该参数是一个从1开始的增量数字,表示当前正在上传的部分的“索引”。
端点将响应上传部分的哈希值,该哈希值需要在稍后上传所有部分时存储以完成上传
{ "part": "1", "hash": "86507bea6d332c2814df1d244abdd3696169607f5f42ac3f6782dd69883f6b0d" }
完成上传
POST /files/{file_id}/finalize
{
"hashes": [
{ "part": 1, hash: "86507bea6d332c2814df1d244abdd3696169607f5f42ac3f6782dd69883f6b0d" },
{ "part": 2, hash: "df7c1db235bac334dab81d0a25824055bdb738bf54fd2857698d4a9fd88af2c6" },
]
}
取消多部分上传
DELETE /files/{file_id}/abort