melsaka/mediafile

轻松上传文件和图像到您的 Laravel 应用。

v0.3.0 2023-10-19 16:47 UTC

This package is auto-updated.

Last update: 2024-09-19 18:47:47 UTC


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 个输入(nameslugorder),所有这些都是必需的。

注意: 这两种方法都返回一个 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 列。

当您尝试更新图像(namealttitlecaption)时,只需 name 是必需的。

storeupdate 方法返回一个 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个不同尺寸的编码缩略图(1600w1200w900w600w300w)。

您可以在config/mediafile.php文件中通过更改image_thumbnail_sizes的值来自定义缩略图的数目和每个缩略图的宽度。

图像缩略图分隔符

config/mediafile.php文件中image_thumbnail_separator的默认值是:_

它表示您如何分隔图像名称和图像缩略图尺寸。

这意味着,如果我们上传一个名为cat.png的图像,那么这个图像的缩略图将被命名为以下方式:

(cat_300.webpcat_600.webpcat_900.webp等..)

许可证

本软件包在MIT许可证(MIT)下发布。