画像や様々なファイルを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;
}
?>
ヘッダー情報とあわせて出力するだけで、アップロードしたファイルを表示させることができます。
