chialab/cakephp-object-storage

CakePHP应用程序的对象存储插件

安装: 84

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 1

类型:cakephp-plugin

v0.1.4 2023-05-28 21:19 UTC

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