belca / filehandler
Dios CMS 的文件处理程序
This package is auto-updated.
Last update: 2024-09-23 17:38:52 UTC
README
FileHandler - 可扩展的文件处理包:获取文件信息、修改原始文件、创建文件修改等。
最初 FileHandler 为 Dios CMS 开发,作为处理上传和已保存文件的统一接口。此包可以在任何 PHP 项目中使用。
FileHandler 能做什么?
包不包含处理函数,并且不直接处理文件。
默认情况下,包提供方便处理文件的功能:统一的接口、处理器适配器和基本类实现。
所有文件处理器都需要自行开发或使用第三方处理器,包括来自 Dios CMS 的处理器,如果它们适合您的任务。
在此过程中,FileHandler 的功能允许
- 设置文件处理规则和场景(文件处理配置);
- 设置本地和/或全局处理器列表;
- 设置要处理的原始文件;
- 通过修改和/或提取文件属性来处理原始文件;
- 创建原始文件的修改并获取修改属性。
包的定义和工作特性
包实现的基础是两个接口
- FileHandler - 文件处理的入口点;
- FileHandlerAdapter - 从 FileHandler 调用的文件处理适配器,实现 FileHandler 和外部包(库、类)之间的连接。
FileHandlerAdapter
适配器用于连接 FileHandler 实例调用的处理器和处理器类(例如,FInfo 或 FGen)。
FileHandlerAdapter 接口的主要功能已在抽象类 FileHandlerAdapterAbstract 中实现。如有需要,您可以使用自己的类或实现剩余的方法:construct、merge、getHandlerType 和 handle。
construct 任务
在构造函数中应初始化用于处理文件的类。还可以在该处应用传递给适配器的文件处理设置。
如果您的处理器仅使用静态方法且不需要初始化,则可以在构造函数中设置配置。
merge 方法任务
此方法用于合并多个配置。例如,默认配置和用户在网页应用程序中设置的配置。
方法接受配置合并方式和多个配置集。所有传递的配置应具有相同的格式。
handle 方法任务
启动按指定场景处理的文件,如果使用(并非每个处理器都需要处理场景),并通过 getInfo 方法返回获取的值。
getHandlerType 方法任务
此方法返回 文件处理器类型。该方法可以返回不带变量的常量或访问私有变量并返回其值。
最好返回不带变量的常量,因为处理器的类型不应该在运行时更改。
文件处理器类型
适配器可以返回以下三种处理器类型之一
- extracting - 提取类型处理器;
- generating - 生成类型处理器;
- modifying - 修改类型处理器。
提取处理器处理单个文件,不创建新文件(不修改原始文件也不创建原始文件的修改版本)。提取处理器仅返回有关文件的信息。
实现提取处理器的典型示例是基于FInfo包的处理器适配器实现。
在某些情况下,提取属性可能需要创建临时文件以获取属性。如果后续没有使用这些临时文件(将自动替换为其他数据或删除),则此类处理器仍被视为提取处理器。如果临时文件被用于常规使用,则它不再临时,并且相应的处理器不能被视为提取处理器。
修改处理器修改原始文件,并返回有关文件的新信息(格式、类型、大小等)。这可以通过实现类处理器或其他处理器来完成,如果需要的话。
当更改原始文件的路径(创建新原始文件并更改新文件名后)时,应返回新文件路径。它将被用于进一步处理文件。
在修改文件时,不应保存文件的先前版本。先前文件应被替换或删除。
修改处理器的示例可以是修改上传图像的大小。例如,服务器上上传的图片大小为3543x5315 px。此类文件在存储介质上占用的空间为几个MB(3-15MB)。上传100张此类照片将占用300到1500MB的空间,在某些情况下可能更多。在开发的网站或Web应用程序中用于显示的图像修改,其宽度不超过600px。因此,如果我们永远不需要原始图像的大小,则所有图像都可以至少压缩到1000px宽度(或更小),并且可以进一步应用降低图像质量。结果,输出图像在存储介质上的大小不超过250KB(100-250KB)。因此,“原始”修改图像的总大小可能在存储介质上占用10-25MB。这比300-1500MB小得多,因此可以存储服务器上的更多图像。
有时确实需要以原始方式保存原始文件,至少进行最小更改。原始文件可以在大量现有文件的重生成中使用。例如,公司更换了组织的标志或名称,而所有图像和文件都有带有先前标志和名称的保护性标记。需要将新数据添加到所有现有文件中,并删除旧版本文件。
生成处理器基于原始文件创建新文件。除了新文件外,还可能从适配器处理器直接获取有关文件的其他信息。
生成处理器返回的典型信息
- 新文件的路径(修改);
- 有关文件的简要信息(类型、大小)。
在处理大量处理器时,在生成处理器之后可能调用提取处理器,并获取有关创建的修改的完整信息。
修改文件的典型示例是上传个人资料头像或博客文章的图像到服务器。为了降低数据传输通道的负载并提高页面加载速度,将使用不是原始文件(可能超过1MB)而是其修改版本(如缩略图或缩小图像,大小为20至100KB)。这可以降低数据传输的负载,例如在处理大量图像(用户列表、图像画廊)时。
与主要目标是替换原始文件并通常用于减少占用空间或创建统一文件存储(将所有上传的文档转换为PDF格式)的修改处理器不同,生成处理器通过为单个原始文件创建3-10个文件修改来增加服务器上的空间,以创建舒适的用户体验。
根据网站开发实践,组合修改和生成处理器会导致折衷。结果,服务器上不再使用一个3-5MB大小的图片,而是使用修改后的原始文件,大小最多500KB,总共创建5-8个修改版本,总大小不超过1.5MB。因此,服务器上总共只需占用大约2MB,而不是3-5MB。
处理器的能力不仅限于修改图像,这只是最常见的一个例子。文件处理器可以用于编辑图像、转换文档、保护音乐文件或视频文件、创建存档等。
FileHandler
此接口及其实现用于指定处理配置、调用所有处理器并在处理后获取数据。
处理器的一个重要特性是存在处理规则,这些规则通过配置和文件处理场景来指定。
文件处理场景允许根据文件上传方式指定不同的文件处理选项。此外,如果处理器允许,文件处理场景可以在文件处理期间更改。
原始文件的处理和文件修改的创建是分开指定的,前提是遵守文件处理配置规则(原始文件处理器不应创建修改,生成处理器不应修改或替换原始文件)。
FileHandler允许提取文件处理器的具体(基本)属性和附加属性。
表中列出了类的主要方法。更详细的信息包含在类本身中。
如何使用FileHandler?
通过composer(Packagist存储库)或从GitHub仓库克隆来安装FileHandler。
$handlers = [ 'finfo' => \Belca\File\FileHandler\FInfoHandler::class, ];
$rules = [ 'finfo' => [ 'handlers' => [ 'basic' => \Belca\FInfo\BasicFileinfo::class, ] ], ];
$scripts = [ 'user-device' => [ 'sequence' => ['fgen', 'finfo'], 'properties' => ['finfo.size', 'finfo.mime' => 'mimetype', 'finfo.created'], 'handlers' => [ 'fgen' => [], 'finfo' => [], ], ], ];
$directory = '/usr/www/html/webapp/files';
$fileHandler = new FileHandler($handlers, $rules, $scripts); // 处理规则和脚本可以单独更改 $fileHandler->setDirectory($directory); $fileHandler->setOriginalFile($originalFile, $fileinfo); $fileHandler->setNameExecutableScript($scriptName);
// 处理器执行的顺序可以在文件处理场景中指定 $fileHandler->setHandlersSequence($sequence);
// 基本属性可以在文件处理场景中指定 $fileHandler->setBasicPropertyNames($basicPropertyNames);
// 每个处理器包括合并规则和场景的方法,或者使用标准的数据合并方法。
// 如果需要,可以在类初始化后合并处理规则或处理场景。也可以使用工具在类实例外部合并数据。FilaHandlerUtility
// 如果保存成功,将原始文件保存在新目录并执行处理 if ($fileHandler->save($filename)) { $fileHandler->handle($script);
// Получаем информацию после обработки файла
// Информация об оригинальном файле
$basicFileinfo = $fileHandler->getBasicFileProperties();
$additionalFileinfo = fileHandler->getAdditionalFileProperties();
// Информация о модификациях
$basicPropertiesModifications = $fileHandler->getBasicProperties();
$additinalPropertiesModifications = $fileHandler->getAdditionalProperties();
}
开发和使用处理器(FileHandlerAdapter)
FileHandler的其他特性
许可证
此包根据MIT许可证分发。