xi/filelib

v0.16.0 2018-08-19 18:14 UTC

README

Build Status

Filelib 是一个用于 PHP 的文件库组件,为您的网络应用程序文件提供虚拟文件系统。它可以用来以多种方式管理您应用程序的内部文件和用户上传的文件。至少目前它不是一个存储诸如 css、js 等资产的地方。

面对现实:几乎所有网络应用程序都必须存储文档、媒体等,需求是相同的。Filelib 处理了所有困难和/或重复的任务,并将所有相关可变组件抽象为松散耦合的子系统。

  • 在数据存储(通常是数据库)中存储元数据(虚拟文件夹/文件)。
  • 在文件系统(本地、S3、Gridfs 等)中安全地存储文件。
  • 授权(谁可以在虚拟文件系统中做什么)和发布(使它们快速可读且具有漂亮的 URL)可公开读取的文件。
  • 将文件呈现为 HTTP 响应(有时您不能公开发布所有内容,但它仍然必须体面)。
  • MIME 类型、扩展名以及所有这些可怕的东西
  • 版本控制(意味着创建主文件的多个表示形式,缩略图、HTML5 视频等)
  • 异步处理(您不能让最终用户等待视频编码完成,您知道)
  • 可能还有更多!

Filelib 可以通过插件和钩子进行完全扩展。事实上,许多“核心”功能是通过插件提供的(授权、自动发布、文件版本),因此核心保持优雅且易于维护。

Filelib 基于我过去 10 年开发许多文件和媒体库时的观察、观点和经验。它与实际项目和用例一起发展和进化,所以感谢所有过去和现在的早期采用者!

项目状态

(2018-08) 我在几年前就已经有所转变。不再那么经常用 PHP 编码了。现在用 JS 做 React 和其他事情。这很遗憾,因为 Filebanksta 几乎要完成了。“完成”。它仍然可用。我只是将所有包升级到现代版本。我打算每年至少再升级一次,加油!

硬性要求

  • 需要文件管理的客户端软件
  • PHP 7.1

软性要求(用于更复杂的使用)

  • 严肃的数据存储(MySQL/MariaDB、PostgreSQL、MongoDB 均支持,开箱即用)
  • ImageMagick 用于图像处理
  • Zencoder 用于您的所有视频需求
  • Intl 用于转写/缩写
  • 队列(RabbitMQ、IronMQ、SQS)用于异步操作

快速入门

使用 JSON 存储(仅用于简单测试)

<?php

use Xi\Filelib\FileLibrary;
use Xi\Filelib\Backend\Adapter\JsonBackendAdapter;
use Xi\Filelib\Storage\Adapter\FilesystemStorageAdapter;
use Pekkis\DirectoryCalculator\DirectoryCalculator;
use Pekkis\DirectoryCalculator\Strategy\UniversalLeveledStrategy;

$filelib = new FileLibrary(
    new FilesystemStorageAdapter(
        __DIR__ . '/files',
        new DirectoryCalculator(new UniversalLeveledStrategy()
    ),
    new JsonBackendAdapter(__DIR__ . '/filelib-example.json')
);

$file = $filelib->uploadFile('/path/to/some/file.jpg');

// Display the image
header("Content-Type: " . $file->getMimetype());
echo file_get_contents($filelib->getStorage()->retrieve($file->getResource()));

文档

待办事项!

示例和用例

https://github.com/xi-project/xi-filelib-examples 包含了从非常简单到非常复杂用例的大量示例。克隆仓库,配置 Web 服务器,直接进入代码!

关于集成到您自己的软件中

经验一次又一次地证明,集成应该是轻量级的。如果您使用 Doctrine ORM,可能看起来通过 Filelib 的实体进行集成似乎是合适的。不要这么做。它会反过来咬你。

后端平台(以及Filelib提供的其他更深层抽象)内部的所有内容都是库的私有部分,可能会随时更改。因此,如果您使用这些内部组件,请做好进入升级地狱的准备。例如,ORM后端平台中的实体,它们可能在某一天永远消失。

只需在您自己的数据和领域中使用Filelib的标识符(文件夹/文件)的ID/UUID,对于其他所有内容使用Filelib提供的功能。

FolderRepository和FileRepository通常应该深入到您必须达到的程度,但这可能还不是情况。对于一些“更困难”的操作,我个人至少不得不使用Backend和ProfileManager,这些是在达到1.0版本之前需要考虑的事情和用例。

框架集成

有关框架集成,请参阅

实际使用Filelib的应用程序

有关我知道正在使用Filelib的实际应用程序,请参阅

了解更多?请告诉我!