integral/flysystem-pdo-adapter

Flysystem文件抽象层的PDO适配器

1.0.4 2019-02-19 07:24 UTC

This package is not auto-updated.

Last update: 2024-09-11 08:37:02 UTC


README

Build Status License

Flysystem文件系统的PDO数据库适配器。[Flysystem](https://github.com/thephpleague/flysystem) 文件抽象。无需额外依赖,仅需要PDO扩展。

安装

composer require integral/flysystem-pdo-adapter

数据库配置

开始时,您需要创建一个将用于存储文件的表。

以下提供了MySQL、SQLite和PostgreSQL的SQL表模式示例。

MySQL

CREATE TABLE files (
  id int(11) NOT NULL AUTO_INCREMENT,
  path varchar(255) NOT NULL,
  type enum('file','dir') NOT NULL,
  contents longblob,
  size int(11) NOT NULL DEFAULT 0,
  mimetype varchar(127),
  timestamp int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (id),
  UNIQUE KEY path_unique (path)
);

SQLite

CREATE TABLE files (
    id INTEGER PRIMARY KEY,
    path TEXT NOT NULL UNIQUE,
    type TEXT NOT NULL,
    contents BLOB,
    size INTEGER NOT NULL DEFAULT 0,
    mimetype TEXT,
    timestamp INTEGER NOT NULL DEFAULT 0
)

PostgreSQL

CREATE TABLE public.files (
  id serial NOT NULL,
  path varchar(255) NOT NULL,
  type varchar(4) NOT NULL,
  contents bytea,
  size integer NOT NULL DEFAULT 0,
  mimetype varchar(127),
  "timestamp" integer NOT NULL DEFAULT 0,
  is_compressed boolean NOT NULL DEFAULT true,
  update_ts timestamp(0) with time zone DEFAULT NOW(),
  CONSTRAINT files_pkey PRIMARY KEY (id),
  CONSTRAINT type_check CHECK (type='dir' or type='file'),
  CONSTRAINT path_unique UNIQUE (path)
);

用法

通过传递有效的PDO对象和表名作为构造函数参数来创建适配器

MySQL

// https://php.ac.cn/manual/pl/ref.pdo-mysql.connection.php
$pdo = new PDO('mysql:host=hostname;dbname=database_name', 'username', 'password');
$adapter = new PDOAdapter($pdo, 'files');

SQLite

// https://php.ac.cn/manual/pl/ref.pdo-sqlite.connection.php
$pdo = new PDO('sqlite:/absolute/path/to/database.sqlite');
$adapter = new PDOAdapter($pdo, 'files');

PostgreSQL

// https://php.ac.cn/manual/pl/ref.pdo-pgsql.php
$pdo = new PDO('pgsql:host=localhost;port=5432;dbname=testdb;user=bruce;password=mypass');
$adapter = new PDOAdapter($pdo, 'public.files');

然后只需将创建的适配器传递给\League\Flysystem\Filesystem

$filesystem = new Filesystem($adapter);

完成!此时,$filesystem已准备好使用。

注意

此实现模拟了树状结构的文件系统,因此一些操作(如重命名或删除文件夹)会产生大量的数据库查询,这可能导致某些场景的性能不佳。