rachyharkov/codeigniter4-media

Codeigniter 4 用于管理文件或媒体以及处理上传行为的库

dev-main 2024-09-04 12:30 UTC

This package is auto-updated.

Last update: 2024-09-04 12:30:20 UTC


README


Banner

CodeIgniter 4 媒体库

用于处理媒体上传文件任务的Codeigniter包(至少对我的当前工作有所帮助)。我在这款包上的主要目标是让Codeigniter 4有一个库,能够处理诸如用最少的代码组织文件上传等任务,同时我也受到了Laravel Media Library的启发,因此我决定制作这个包。

Latest Version on Packagist Total Downloads Contributors Forks Stargazers Issues MIT License LinkedIn

目录

入门

以下是如何在本地设置项目的一个示例。要使本地副本启动并运行,请按照以下简单的示例步骤进行。

先决条件

  • PHP 7.2+
  • CodeIgniter 框架(建议使用4.*版本)
  • Composer
  • PHP套接字扩展已启用

安装

composer require rachyharkov/codeigniter4-media @dev

发布资源

您需要发布默认配置的资源

php spark media:publish

迁移

然后迁移新发布的表

php spark migrate

设置模型

只需将您的模型设置如下

use CodeIgniter\Model;
use Rachyharkov\CodeigniterMedia\HasMedia;
use Rachyharkov\CodeigniterMedia\InteractsWithMedia;

class User extends Model implements HasMedia
{
    use InteractsWithMedia;

    // rest of codes
}

完成

如何使用?

存储单个文件

使用HTML输入的名称属性让codeigniter4-media获取文件,并将其添加到指定的集合中(如果没有输入名称,则使用“默认”)

$this->user_model->insert($data);
$this->user_model->addMediaFromRequest('photo')->toMediaCollection('profile_photo');

存储单个文件 - 存储缩略图

如果您想存储文件的缩略图,只需在addMediaFromRequest方法之后添加withThumbnail方法即可

$this->user_model->insert($data);
$this->user_model->addMediaFromRequest('photo')->withThumbnail()->toMediaCollection('profile_photo');

存储单个文件 - 使用自定义名称

仅在addMediaFromRequest方法之后使用usingFileName方法,这将在将文件存储到数据库之前重命名文件非常有用

$this->user_model->insert($data);
$this->user_model->addMediaFromRequest('photo')->usingFileName('data_'.random(20))->toMediaCollection('profile_photo');

存储多个文件 - 不同名称

从多个不同请求名称存储文件(例如,您有两个具有不同输入文件名称属性值的输入文件,并且您想将它们存储到同一集合中)

$this->user_model->insert($data);
$this->user_model->addMediaWithRequestCollectionMapping([
      'file_input_photo' => 'profile_photo_collection',
      'file_input_profile_cover' => 'profile_photo_collection'
    ])

存储多个文件 - 同一名称

这次使用addMedia,确保它是一个文件对象(二进制有效负载),以便addMedia可以接受值,在这个示例中使用了具有相同名称属性值的多个文件输入

$this->product_model->insert($data);
$product_images = $this->request->getFiles();

    foreach ($product_images['photos'] as $key => $p) {
    $this->product_model->addMedia($p)->toMediaCollection('product_image');
    }

获取单个文件 - 元数据

$user = $this->user_model->where('id', $id)->first();
$user->photo = $this->user_model->mediaOf('profile_photo')->getFirstMedia();

return view('user/edit', $data);

如果没有返回文件元信息,则上述将返回null,像这样处理它

    <img src="<?= $user->media ? $user->media->file_path.'/'.$user->media->file_name : $user->media ?>" alt="User Photo Profile">

获取单个文件 - 仅URL

这是如何将新属性(例如用户对象)的新对象分配给现有对象(例如用户对象)的示例,该属性包含文件的URL

$user = $this->user_model->where('id', $id)->first();
$user->photo = $this->user_model->mediaOf('profile_photo')->getFirstMediaUrl();

return view('user/edit', $data);

可以通过传递具有'thumb'值的参数来获取文件的缩略图

$media->getFirstMediaUrl('thumb');

获取集合中的所有文件

$user = $this->user_model->where('id', $id)->first();
$user->collection_of_photo_profile = $this->user_model->mediaOf('profile_photo');

    return view('user/edit', $data);

查询结果需要更多数据?只需分配即可

第二个参数mediaOf()接受拥有记录的媒体的ID

$users  = $this->users_model->findAll();
foreach($users as $key => $value) {
    $users[$key]->photo = $this
                            ->ticket_log_model
                            ->mediaOf('profile_photo', $value->id)
                            ->getFirstMediaUrl();
}

删除文件集合

$this->product_model->where('id', $product->id)->delete();
$this->user_model->clearMediaCollection('profile_photo');

删除并上传?当然可以这样做

找到或更新记录后,就像这样创建控制器中的方法

$this->user_model->find($id);

    //or

$this->user_model->update($data, $id);

$this->user_model->clearMediaCollection('profile_photo');
$this->user_model->addMediaFromRequest('photo')->toMediaCollection('profile_photo');

API模式

在您的控制器中创建方法就像这样,如果想要返回文件元数据(这在上传过程完成后显示文件时很有用,请确保返回它),则将asTemp设置为true

🪄 后端 - 存储文件

public function api_upload()
{
$user_id = $this->request->getVar('user_id');
    return $this->user_model->addMediaFromRequest('file')->toMediaCollection('profile_photo')->responseJson();
}

您将获得此响应

{
    status: "success",
    message: "File uploaded successfuly",
    data: {
        collection_name: "profile_photo"
        file_ext: "jpg"
        file_name: "default"
        file_path: "uploads/profile_photo"
        file_size: 62431
        file_type: "image/jpeg"
        model_id: "200090"
        model_type: "App\\Models\\User"
        orig_name: "20211128_165410.jpg"
        unique_name:  "1691502324_94b5e01970c97f5ac670.jpg"
    }
}

🪄 后端 - 删除文件

在您的控制器中创建方法如下(请确保返回responseJson方法)

    public function api_delete()
    {
        return $this->user_model->clearMediaCollection(request()->getVar('temp_id'), 'profile_photo')->responseJson();
    }

您将获得此响应

    {
        status: "success",
        message: "File 1691502324_94b5e01970c97f5ac670.jpg deleted successfuly",
    }

路线图

查看开放问题以获取建议功能(和已知问题)列表。

贡献

贡献使开源社区成为一个如此美妙的学习、灵感和创造的地方。您所提供的任何贡献都非常受欢迎

  1. 分支项目
  2. 创建您的功能分支(git checkout -b feature/AmazingFeature
  3. 提交您的更改(git commit -m '添加一些AmazingFeature'
  4. 推送到分支(git push origin feature/AmazingFeature
  5. 打开Pull Request

许可证

在MIT许可证下分发。有关更多信息,请参阅LICENSE文件。

联系

Rachmad Nur Hayat - https://rachmad.dev - rachmadnurhayat@gmail.com

在Trakteer上的支持

喜欢我所做的吗?请在Trakteer上支持我

海外吗?您可以Paypal支付给我

rachyharkov rachyharkov