Last updated: 12/22/2002 Top ドキュメントTop

データベース管理システム 管理者用ガイド
ファイル型

概要

本システムでは、ファイルをデータの一部として管理することができます。 データ定義ファイルのカラムの型を 'file' とすると、 そのカラムにファイルが格納されているかのように扱われます (データ定義ファイルの $self->{db}{col}{$dbt}[*]{type} 参照)。

ファイルのアップロードは、フォームからのデータの追加/修正、 または dbipg_file_upload コマンド を通して行うことができます。 CSV/タブ区切りファイルからのデータの追加/修正からは、 ファイルのアップロードはできません。

ファイルのアップロード

フォームからのデータの追加/修正で、データの挿入が完了するまでの間は、 アップロードされたファイルはデータ定義ファイルの $self->{global}{filetype}{tmpdir} の指すディレクトリに格納されます。 データの挿入が完了すると、 ファイルは $self->{global}{filetype}{tmpdir} に格納されます。

フィルタによるファイルの加工に失敗したとき等のため、 データの挿入が完了すると、フィルタを通す前のファイルが $self->{global}{filetype}{pool} に格納されます。 $self->{global}{filetype}{pool} に格納されたファイルは、 システムで管理しませんので、編集・削除をしても構いません。

情報の漏洩を防ぐため、ファイル名には、予想されにくい文字列が使われます。 しかし、$self->{global}{filetype}{pool} は (suEXEC を利用し、かつディレクトリのパーミッションが適切ならば) 第三者からアクセスされないはずなので、 このディレクトリに格納されるファイルには、 わかりやすい名前が付けられます。

ファイルが MacBinary 形式で、 かつ挿入元のホストのOSが Macintosh と判断されれば、 データフォークのみが自動で抜き出されます。

サムネイル

対応する $self->{db}{col}{$dbt}[*]{search} の値を true とすることで、サムネイルを利用することができます。 サムネイルを利用する場合は、必ずフィルタを設定しなければいけません。 サムネイルも、元のファイルと同様にファイル型とみなされます。

サムネイルのフォーマットは、元のファイルと異なっていても構いません。 しかし、元のファイルから自動生成できる必要があります。 サムネイルの使用例としては、 画像ファイルからサムネイルを生成して利用する、 PDF ファイルから HTML ファイルを生成して利用する、 などがあります。

フィルタ

対応する $self->{db}{col}{$dbt}[*]{subst} に サブルーチンへのリファレンスを指定することで、 アップロードされたファイルにフィルタをかけて加工することができます。 ファイルのフォーマットが正しいかどうかを調べるとき、 ファイルに拡張子を付ける場合にもフィルタを記述する必要がありますので、 特別な場合を除けば、フィルタを記述しなければいけないでしょう。

サブルーチンの引数は ($file, $thumbnail) とし、 返り値は ($ext, $ew) とします。

フィルタは、アップロードされたファイルがフォーマットに従っているかを調べ、 ファイルを変換し、必要ならばサムネイルを生成するように書きます。 フィルタの中では、拡張子 $ext を決定し、 変換後のファイル "$file.$ext"、変換後のサムネイル "$thumbnail.$ext_tn" を作成してください。元のファイルは消さないでください。

ファイルにエラーがある場合は、$ext には undef を代入し、 $ew にはエラーの内容を記述してください。 一方、ファイルに対して警告を出したい場合は、$ext には拡張子を記入し、 $ew には警告の内容を記述してください。

拡張子が undef の場合、ファイル "$file.$ext" が存在しない場合、 ファイルサイズが 0 の場合などは、ファイルはエラーとみなされます。 また、フィルタの実行時に標準エラー出力に文字列が出力された場合は、 その文字列が管理者にメールで送られ、ファイルはエラーとみなされます。

sys_file テーブル

sys_file テーブルとは、システムが管理しているテーブルの一つです。 ファイルがアップロードされたときの情報が、 sys_file テーブルに格納されています。 この処理は、DBIPgSystem::DB::_insert_filedb メソッド により行われます。 ファイルに関して問題が起こったときなどに活用してください。