rachyharkov / codeigniter4-media
Codeigniter 4 用于管理文件或媒体以及处理上传行为的库
Requires
- php: >=7.3
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-04 12:30:20 UTC
README
CodeIgniter 4 媒体库
用于处理媒体上传文件任务的Codeigniter包(至少对我的当前工作有所帮助)。我在这款包上的主要目标是让Codeigniter 4有一个库,能够处理诸如用最少的代码组织文件上传等任务,同时我也受到了Laravel Media Library的启发,因此我决定制作这个包。
目录
入门
以下是如何在本地设置项目的一个示例。要使本地副本启动并运行,请按照以下简单的示例步骤进行。
先决条件
- 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", }
路线图
查看开放问题以获取建议功能(和已知问题)列表。
贡献
贡献使开源社区成为一个如此美妙的学习、灵感和创造的地方。您所提供的任何贡献都非常受欢迎。
- 分支项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m '添加一些AmazingFeature'
) - 推送到分支(
git push origin feature/AmazingFeature
) - 打开Pull Request
许可证
在MIT许可证下分发。有关更多信息,请参阅LICENSE
文件。
联系
Rachmad Nur Hayat - https://rachmad.dev - rachmadnurhayat@gmail.com
在Trakteer上的支持
喜欢我所做的吗?请在Trakteer上支持我
海外吗?您可以Paypal支付给我