czim/file-handling

此包最新版本(2.3.0)没有可用的许可信息。

文件处理助手

2.3.0 2024-09-16 10:01 UTC

README

Latest Version on Packagist Software License Build Status Coverage Status

文件处理和存储助手

处理上传、操作和(外部)存储

变更日志

查看变更日志.

用法

此包与框架无关。

以下是一般设置变体处理示例

<?php
    // Set up a storage implementation (for your framework of choice), and a PSR-11 container implementation.
    /** @var \Czim\FileHandling\Contracts\Storage\StorageInterface $storage */
    /** @var \Psr\Container\ContainerInterface $container */
    
    $sourcePath = 'storage/input-file-name.jpg';
    

    // Source File
    $helper      = new \Czim\FileHandling\Support\Content\MimeTypeHelper;
    $interpreter = new \Czim\FileHandling\Support\Content\UploadedContentInterpreter;
    $downloader  = new \Czim\FileHandling\Support\Download\UrlDownloader($helper);
    $validator   = new \Czim\FileHandling\Support\Download\UriValidator();
    $factory     = new \Czim\FileHandling\Storage\File\StorableFileFactory(
        $helper,
        $interpreter,
        $downloader,
        $validator
    );

    $file = $factory->makeFromLocalPath($sourcePath);

    // Handler
    $strategyFactory = new \Czim\FileHandling\Variant\VariantStrategyFactory($container);
    $strategyFactory->setConfig([
        'aliases' => [
            'resize'     => \Czim\FileHandling\Variant\Strategies\ImageResizeStrategy::class,
            'autoOrient' => \Czim\FileHandling\Variant\Strategies\ImageAutoOrientStrategy::class,
        ],
    ]);

    $processor = new \Czim\FileHandling\Variant\VariantProcessor($factory, $strategyFactory);

    $handler = new \Czim\FileHandling\Handler\FileHandler($storage, $processor);
    
    $handler->process($file, new Target($file->path()), [
        'variants' => [
            'tiny' => [
                'autoOrient' => [],
                'resize' => [
                    'dimensions' => '30x30',
                ],
            ],
            'orient' => [
                'autoOrient' => [
                    'quiet' => false,
                ],
            ],
        ],
    ]);

对于Laravel,可以使用以下特定于框架的存储实现

<?php
    // Storage
    $storage = new \Czim\FileHandling\Storage\Laravel\LaravelStorage(
        \Storage::disk('testing'),
        true,
        url('testing')
    );
   
    // If you're using a Laravel version that does not have a PSR-11 compliant container yet:
    $container = new \Czim\FileHandling\Support\Container\LaravelContainerDecorator(app());
    
    app()->bind(\Imagine\Image\ImagineInterface::class, \Imagine\Gd\Imagine::class);

当然,建议使用您框架的依赖注入/ IoC解决方案来简化上述方法。

自定义容器

如果您没有可行的PSR-11容器,可以使用此包提供的非常简单的实现。

<?php
    $container = new \Czim\FileHandling\Support\Container\SimpleContainer;
    
    $container->registerInstance(
        \Czim\FileHandling\Variant\Strategies\ImageResizeStrategy::class,
        new \Czim\FileHandling\Variant\Strategies\ImageResizeStrategy(
            new \Czim\FileHandling\Support\Image\Resizer(
                new \Imagine\Gd\Imagine
            )
        )
    );
    $container->registerInstance(
        \Czim\FileHandling\Variant\Strategies\ImageAutoOrientStrategy::class,
        new \Czim\FileHandling\Variant\Strategies\ImageAutoOrientStrategy(
                new \Czim\FileHandling\Support\Image\OrientationFixer(new \Imagine\Gd\Imagine)
            )
    );

存储

可以使用可定制的存储实现来存储文件。

提供了Laravel存储的一个非常简单的适配器/装饰器。对于任何其他框架/设置,您现在必须自己编写实现 \Czim\FileHandling\Contracts\Storage\StorageInterface

变体

在处理文件时,可以自动创建变体并将其与原始文件一起存储。

这些可以是原始图像的缩放、裁剪或重新着色。此包已配置为允许您轻松创建自己的变体策略。

单个变体由一个或多个策略步骤定义,这使得可以组合效果和重用策略。

可以从原始文件重新创建变体。

请注意,此包旨在轻松创建和添加自定义变体策略。以下列出的策略源代码仅供参考,以帮助您开始。

图像策略

包含的图像操作策略

  • ImageAutoOrientStrategy:重新定位旋转或翻转的图像。

  • ImageResizeStrategy:缩放(并裁剪)图像。
    (使用Stapler的选项和缩放方法。)

  • ImageWatermarkStrategy:将水印粘贴到图像上。
    在任意角或中心。
    选项
    position(字符串):top-lefttop-rightcenterbottom-leftbottom-right
    watermark(字符串):水印图像的完整路径。
    水印应使用PNG(透明)图像以获得最佳效果。

  • ImageOptimizationStrategy:优化图像以减小其文件大小。

    此策略需要安装 spatie/image-optimizer

    要使其工作,您还需要安装一些图像优化器

    • jpegoptim
    • optipng
    • pngquant
    • svgo
    • gifsicle

    Ubuntu的安装示例

    sudo apt-get install jpegoptim optipng pngquant gifsicle
    sudo npm install -g svgo

    MacOS的安装示例,使用 Homebrew

    brew install jpegoptim optipng pngquant svgo gifsicle

视频策略

包含的视频操作策略

  • VideoScreenshotStrategy:提取视频帧以进行预览。
    (需要 ffmpeg/ffprobe。)
    选项
    seconds(整数):捕获视频帧的时间(秒)。
    percentage(整数):捕获视频帧的百分比(由seconds覆盖)。 ffmpeg(字符串):ffmpeg二进制文件的路径(如果不是/usr/bin/ffmpeg)。 ffprobe(字符串):ffprobe二进制文件的路径(如果不是/usr/bin/ffprobe)。

变种陷阱

当处理可能存在EXIF旋转的图像时,使用调整大小策略,请注意,仅调整宽高(横竖)可能遇到问题,除非它们首先自动定位。

因此,建议在 ImageResizeStrategy 之前使用 ImageAutoOrientStrategy

一般来说,考虑策略应用的顺序总是一个好主意。

如果效率很重要,您还可以选择将多个策略合并为一个策略类。您可以使用这种方法来防止多次打开/保存同一文件。

处理URI内容

在之前的版本中,此包会自动从具有URI的本地或远程文件的原始字符串内容中检索内容。现在默认已禁用此功能,以最小化安全风险。

有关此更改的更多信息,请参阅 SECURITY

配置

文件处理的配置是通过向FileHandler注入一个具有树结构的关联数组来设置的。

贡献

有关详细信息,请参阅 CONTRIBUTING

致谢

许可协议

MIT许可协议(MIT)。有关更多信息,请参阅 许可文件