PHPでファイルアップロード・・・めんどくさいですね。

ましてやAmazonS3にアップロード、パフォーマンスまたはコストの為にローカルキャッシュを持たせる..

ローカルに保存していたファイルをクラウドに移行、または別のクラウドサービスに移行..

すごくめんどくさい

そんな時の抽象レイヤー

Gaufrette - https://github.com/KnpLabs/Gaufrette

ローカルファイルシステム

<?php

use Gaufrette\Filesystem;
use Gaufrette\Adapter\Local as LocalAdapter;

$adapter = new LocalAdapter('/var/media');
$filesystem = new Filesystem($adapter);

$content = $filesystem->read('hoge.txt');

$content = 'Hello gaufrette';

$filesystem->write('hoge.txt', $content);

アダプターを変えるだけで、色々なファイルシステムにアクセスできます

Amazon S3

<?php
$service = S3Client::factory(['key' => 'key_here', 'secret' => 'secret_here']);
$adapter  = new Gaufrette\Adapter\AwsS3($service, 'bucket-name');

移行も簡単にできてしまうのが容易に想像できますね!

キャッシング

<?php
$ttl = 3600;
$adapter = new Gaufrette\Adapter\Cache($slowAdapter, $localAdapter, $ttl);
$filesystem = new Gaufrette\Filesystem($adapter);

他にもアダプタはたくさん

  • Rackspace
  • OpenStack
  • Dropbox
  • DoctrineDbal
  • Ftp
  • etc

https://github.com/KnpLabs/Gaufrette/tree/master/src/Gaufrette/Adapter

SymfonyにはKnpGaufretteBundleもあります

https://github.com/KnpLabs/KnpGaufretteBundle

アダプタをサービスにする手間が省ける他に、LiipImagineBundle(サムネイルを生成するバンドル)上でGaufretteを使う事も容易になります。

  1. KnpGaufretteBundleStreamWrapper を定義
  2. LiipImagineBundle1のStreamWrapper をデータソースとする StreamDataLoader を定義

何も困る事はありませんね!

詳しくはドキュメントにあります。

https://github.com/liip/LiipImagineBundle/blob/master/Resources/doc/data-loader/stream.md

ローカルファイルシステムにしか使わないとしても便利なのでおすすめです。