画像や様々なファイルをDBに格納
開発環境:CakePHP2.5.1
画像やWord、Excel、PDFなど様々なファイルをアップロードさせたい時に、そのデータをサーバー上に保存するのも一つの方法ですが、DBに保存してしまう方法もあります。
格納するテーブルを作成
データを保存するテーブルを作成します。
CREATE TABLE `attachments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `filename` text NOT NULL, `type` text NOT NULL, `contents` mediumblob NOT NULL, PRIMARY KEY (`id`) );
filenameはファイル名、typeはファイルタイプ、contentsはファイルの中身を入れるカラムになります。
ここでのポイントはファイルの中身を入れるcontentsの型をそれなりに大きいmediumblobとするところです。
ビューにFormの準備
次にビューにファイルをアップロードするFormを準備します。
<?php echo $this->Form->create('Attachment', array('enctype' => 'multipart/form-data')); ?> <?php echo $this->Form->file('attachment'); ?> <?php echo $this->Form->submit('アップロード'); ?> <?php echo $this->Form->end(); ?>
フォームのデータを受け取ってDB格納
データを受け取って格納する処理です。
<?php public function hoge() { if (!empty($this->request->data)) { $data = array( 'Attachment' => array( 'filename' => $this->request->data['Attachment']['attachment']['name'], 'type' => $this->request->data['Attachment']['attachment']['type'], 'contents' => file_get_contents($this->request->data['Attachment']['attachment']['tmp_name']), ) ); if ($this->Attachment->save($data)) { $this->Session->setFlash('アップロードしました'); } else { $this->Session->setFlash('アップロードできませんでした'); } } } ?>
こんな感じでどのようなファイルでもDBに格納することができます。
DBに保存したファイルデータを表示
次に保存したデータを表示させます。
<?php function attachment($id) { $attachment = $this->Attachment->findById($id); $this->layout = false; header('Content-type: ' . $attachment['Attachment']['type']); header('Content-Disposition: attachment; filename="' . $attachment['Attachment']['filename'] . '"'); echo $attachment['Attachment']['contents']; exit; } ?>
ヘッダー情報とあわせて出力するだけで、アップロードしたファイルを表示させることができます。