melsaka / mediafile
轻松上传文件和图像到您的 Laravel 应用。
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.2
- intervention/image: ^2.7
- laravel/framework: ^10.10
README
简化将文件和图像添加到您的 Laravel 应用的过程。
特性
-
支持在
'storage/app/public/'
中创建、编辑、删除文件夹的能力。 -
以极简单的方式将这些文件夹中的文件和图像上传。
-
为每个上传的图像自动创建宽度可选的缩略图。
-
将缩略图图像编码为给定格式(可用格式),默认:
'webp'
。 -
除了重命名文件、添加图像 alt、标题和字幕外,您还可以轻松获取文件大小和图像 srcset 和 sizes
$media->getSrcset()
。 -
提供内置的路由、控制器、模型和视图,使您在安装后无需编写任何额外代码即可立即开始。
-
支持 Laravel Livewire。
示例用法
将文件上传到服务器,并将其放置在 'storage/app/public/media/images'
中的图像目录。
这将创建并返回一个 Media
记录,可用于引用该文件。
$folder = Folder::whereSlug($request->folder)->firstOrFail();
$mediafile = new MediaFile($folder); $media = $mediafile->store($request->file('file'));
您也可以通过以下方式更新媒体记录
$media = $mediafile->update($request, $media);
通过以下方式删除媒体记录
$mediafile = new MediaFile($folder); $mediafile->delete($media);
安装
使用 composer 将包添加到您的 Laravel 应用。
composer require melsaka/mediafile
在 config/app.php 中注册包的服务提供者。在 Laravel 5.5 及更高版本中,如果启用了包自动发现,则可以跳过此步骤。
'providers' => [ ... Melsaka\MediaFile\MediaFileServiceProvider::class, ... ];
使用 artisan 将包的配置文件(src/config/mediafile.php)发布。
php artisan vendor:publish --tag=mediafile-config
使用 artisan 将包的资产文件(src/public/)发布。
php artisan vendor:publish --tag=mediafile-assets
运行迁移以将所需表添加到数据库。
php artisan migrate
(可选) 您还可以使用这些 artisan 命令发布控制器、迁移和视图。
// publish controllers
php artisan vendor:publish --tag=mediafile-controllers
// publish migrations
php artisan vendor:publish --tag=mediafile-migrations
// publish views
php artisan vendor:publish --tag=mediafile-views
如何使用
在您上传图像之前,您必须创建一个文件夹来放置图像,默认情况下,文件夹将创建在 storage/app/public/media/
文件夹中,
但您可以通过 config/mediafile.php
文件自定义此设置,以在 storage/app/public/
文件夹中创建它们。
我们可以使用 MediaFolder
类轻松创建这样的文件夹
// import the MediaFolder Class use Melsaka\MediaFile\MediaFolder; // create a MediaFolder instance $mediafolder = new MediaFolder(); // and finally create the folder $mediafolder->store($request->name, $request->order);
store 方法接受两个参数:文件夹的 $name
和数字 $order
。它将自动根据 $name
值创建唯一的 slug。
要编辑文件夹,您必须在您的 $request 中有 3 个输入(name
、slug
、order
),所有这些都是必需的。
注意: 这两种方法都返回一个 Folder
eloquent 实例。
$mediafolder->update($request, $folder);
删除文件夹及其所有文件非常简单。
$mediafolder->delete($folder);
创建文件夹后,您可以使用 MediaFile
类将文件/图像上传到其中。
// import the MediaFile Class use Melsaka\MediaFile\MediaFile; // select the folder that you wanna upload images into it. $folder = Folder::whereSlug($request->folder)->firstOrFail(); // create a MediaFile instance $mediafile = new MediaFile($folder); // and finally upload/store the iamge $mediafile->store($request->file('image'));
注意: 要上传文件,您必须登录,因为 MediaFile
类将 auth()->id()
分配给数据库中的 user_id
列,
但您也可以通过将 true
传递给第二个参数作为访客上传文件,如下所示: new MediaFile($folder, true)
。
在这种情况下,它将 0
分配给数据库中的 user_id
列。
当您尝试更新图像(name
、alt
、title
、caption
)时,只需 name
是必需的。
store
和 update
方法返回一个 Media
eloquent 实例,您可以通过这种方式更新文件
$mediafile->update($request, $media);
删除文件也非常简单。
$mediafile->delete($media);
您可以使用 createUploadImageFromUrl()
方法从 URL 上传图像文件
$imageUrl = 'https://source.unsplash.com/featured/300x201'; $imageFile = $mediafile->createUploadImageFromUrl($imageUrl); $mediafile->store($imageFile);
您还可以使用它与 Laravel Livewire 一起使用,如下所示使用 livewireFile()
方法
namespace App\Livewire; use Livewire\Component; use Livewire\WithFileUploads; class UploadPhoto extends Component { use WithFileUploads; public $photo; public function save() { $uploadedImage = $mediafile->livewireFile($this->photo); $mediafile->store($uploadedFile); } }
您可以像这样检查一个文件是否属于某个文件夹:
$mediafile = new MediaFile($folder); $mediafile->isFolder($media);
以下是您可以从Media
优雅实例中获取的内容。
use Melsaka\MediaFile\Models\Media; $media = Media::first(); // User Instance $media->user; // Fodler Instance $media->folder; // File name without extension $media->name; // File extension $media->extension; // The encoder used for this image, ex: webp $media->encoder; // The type of the file, ex: Image/png $media->type; // The uri of the file, ex: storage/images/2023/08/image.png $media->uri; // The width of the image, ex: 1920 $media->width; // The height of the image, ex: 1080 $media->height; // The alt of the image file $media->alt; // The title of the image file $media->title; // The caption of the image file $media->caption;
Media
优雅实例还有一些有用的辅助器(方法),您可能需要使用。
// returns the original file url $media->getFileLink(); // returns the full file name, ex: image.png $media->getFileName(); // returns file size, ex: 128 kb $media->getFileSize(); // returns true if file is image $media->isFileAnImage(); // returns the url of the encoded version of the original image file. $media->getEncodedImageLink(); // returns the sizes and urls of the image thumbnails when $onlySizes is true, // when you set $onlySizes to false it will returns the seperator, sizes, and urls. // The $name param allows to get the url of a single thumbnail, ex: $media->getThumbnail('s') $media->getThumbnails($name = null, $onlySizes = true); // returns the srcset of an image file. $media->getSrcset(); // returns the sizes of an image file. $media->getSizes();
媒体文件配置
现在让我们来看看config/mediafile.php
文件以及可用的选项。
内置路由和控制器
MediaFile
提供了一套预先配置好的路由和控制器,允许您上传文件和图像而无需编写任何代码。
use Illuminate\Support\Facades\Route; use Melsaka\MediaFile\MediaFile; MediaFile::routes();
现在您可以通过访问应用程序中的/mediafiles
来使用此功能。例如:example.test/mediafiles
。
您还可以通过将路径名传递给MediaFile::routes($path)
方法来将路径名从/mediafiles
更改为您想要的任何路径。
MediaFile::routes('media');
现在您可以通过访问/media
来使用此功能。例如:example.test/media
。
媒体文件夹
MediaFile
允许您在将文件上传到文件夹之前创建文件夹。默认情况下,主文件夹名为media
,文件夹创建在此路径下:storage/app/public/media/
。
您可以通过更改config/mediafile.php
文件中的'folder_name'
值来更改主文件夹名media
。
如果您想在不创建主文件夹的情况下直接在公共文件夹storage/app/public/
内创建文件夹,可以将值更改为null,如下所示:'folder_name' => null
。
图像编码器
每个上传的图像都将有一个编码版本,以及具有不同尺寸的编码缩略图,默认编码图像数据为webp
。
但您可以通过更改config/mediafile.php
文件中的image_encoder
值来将其更改为您喜欢的任何图像格式。
有关支持的格式的更多信息,请参阅此链接:https://image.intervention.io/v2/api/encode。
图像缩略图
每个上传的图像都将有5个不同尺寸的编码缩略图(1600w
、1200w
、900w
、600w
、300w
)。
您可以在config/mediafile.php
文件中通过更改image_thumbnail_sizes
的值来自定义缩略图的数目和每个缩略图的宽度。
图像缩略图分隔符
config/mediafile.php
文件中image_thumbnail_separator
的默认值是:_
。
它表示您如何分隔图像名称和图像缩略图尺寸。
这意味着,如果我们上传一个名为cat.png
的图像,那么这个图像的缩略图将被命名为以下方式:
(cat_300.webp
、cat_600.webp
、cat_900.webp
等..)
许可证
本软件包在MIT许可证(MIT)下发布。