Mediaプラグインをアップロード処理の基本から学ぶ(1) - 導入
イントロダクション
davidpersson/media - GitHub
Mediaプラグインとは、CakePHPのプラグインの一つです。
主にアップロードファイルを取り扱うプラグインで、CakePHPでアップロードの処理をするためのデファクトスタンダードとなっています。
このプラグインはファイルのアップロードからアップロードされたファイルの検証、DBへのメタデータの保存、変換、ダウンロード、表示、フォーム連携までを多段階に抽象化し、その恩恵として非常に柔軟な設定・拡張ができるようになっています。
バージョン
バージョンとしては、nextブランチ(1.3系、バージョン1.3.x)とmasterブランチ(1.2系、バージョン0.6.x)がありますが、nextブランチがカレントのブランチとなっており、これを使うのが推奨されています。
また、1.2系の場合は、1.3系で取り入れられた拡張方法が足りていないため、不可避の問題が生じる可能性があります。
更に、1.3系では機能が統合・削除・分割などがされているので、古い情報が役に立たない時があります。
この連載では、1.3系の解説になります。
mmライブラリ
Mediaプラグインは、バージョン1.3.0から、内部のファイル変換処理をmmライブラリ(http://github.com/davidpersson/mm)に分割しています。
このため、CakePHP以外のPHPアプリケーションでもmmライブラリを使用することによって、同機能を使用することが可能になりました。
アップロード処理の基本概念
ファイルをweb上でアップロードさせる場合、アプリケーション側では非常に多面的な処理を行います。
アップロードにかける基本的な制限
容量の制限などをPHP、httpdの設定により行います。
大容量のファイルを無制限にアップロードさせるのは、サーバー残容量に深刻なダメージを与えることがあります。
また、場合によっては違法アップロードの温床にもなりかねません。
検証
アップロードされるファイルは基本的に信用できません。
アプリケーション特有の制限、またファイルの種類による制限(画像、音声により異なるなど)をかける必要がある他、悪意のある情報(メタデータ)を取り除いてやる、または許可しない必要があります。
これを緻密にしない限り、アプリケーションの(アップロードに纏わる)品質は担保れされないことでしょう。
画像などの変換処理
サムネイルなどの画像変換を行います。
サムネイル等が必要なくても、一般的にGIFAR(変換の章で説明)などを回避するために、閲覧者に表示させるものは内部でメタ情報を削ったものを提供するため、ほぼ必須の工程となります。
ファイル情報(メタデータ)の取得
アプリケーションの要件によっては、アスペクト比、縦横の長さ、MIMEタイプなどを取得する必要がでてきます。
これらはフィールドキャッシュか、またはキャッシュ機構を用いて適切なコストに抑える必要があるでしょう。
DBへの登録
アップロードされたファイルの基本的な情報は、DBに登録するのが一般的です。
ファイルだけで管理するとなると、複雑なロジックが必要になったり、また探索のコストがスケールしなくなるなど致命的な欠陥を招きます。
ファイルアクセスへの制限
要件によっては、ファイルへの直接のアクセスを制限する必要がでてきます。
ほとんどの場合、ファイル名(URI)にランダム文字列(またはハッシュ)を割り当てることによってこれを達成できます。
権限通りのアクセス制限を施す必要がある場合は、アプリケーションを通すことによってこれを実現するべきでしょう。
次回予告
次回はアップロードの制限、検証の回になります。
アップロード処理の肝と呼ぶべきところで、ここを押さえれば後はロジックに集中できることでしょう。