CakePHPクッキング

画像や様々なファイルを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;
}
?>

ヘッダー情報とあわせて出力するだけで、アップロードしたファイルを表示させることができます。

The following two tabs change content below.

柴田 篤志

愛知県一宮市在住のWEBシステム屋(SE・プログラマ)。PHP、 CakePHPを利用して日々開発中。CakePHPをこれから始める方、ある程度CakePHPで開発をしている初級〜中級者の方を対象に、CakePHPでの開発をスピードアップするための情報をまとめています。CakePHPの案件のご依頼、御見積はこちらへご連絡ください。

最新記事 by 柴田 篤志 (全て見る)

WordPressとCakePHPの共存

サイトを作るのに便利なWordPress。プラグインも数多く用意されて

サイトマップの作成方法

Googleのウェブマスターツールに渡すためのサイトマップの作成方法で

INSERTしたIDを取得する

データを保存した後にINSERTされたデータのIDを使って何かの処理を

ファイルの存在確認やフォルダー内のファイル一覧取得

特定のファイルの存在を確認したい場合や特定のフォルダー内にあるファイル

リンクの最後に常にスラッシュをつける方法

URLの最後に常にスラッシュをつけるかつけないかを統一する方法は、UR

countやsumを使う時のフィールド名を指定する

CakePHPでcountやsumなどを使う場合、ちょっとした工夫が必

Formの便利な使い方

問い合わせフォームや会員機能など、WEBサイトを作る際に必ず必要になる

ヘルパーをオーバーライドする

CakePHPで便利な機能が詰まったヘルパーですが、時々もう少しこうだ

特定の時だけSQLの条件を追加するならSet::mergeを使う

SQLの条件を追加したい時に使うのがarray_mergeなどですが、

ページネーションではDISTINCTではなく、GROUP BYを使う

重複したデータを省く時に使うDISTINCTですが、ページ送りで使う時

Model内で別のModelを呼び出す

モデル内で別のモデルを使いたいケースがあった場合、次のようにすることで

CakePHPでGoogleAnalyticsAPIを使う

CakePHPでGoogleAnalyticsを使う方法について見てい

独自のfindを定義するfindMethods

findをより便利に、よりスッキリ書くのに、findMethodsを使

TCPDFを使ってCakePHPでPDFを作成

CakePHPでPDFを作成するには幾つかの方法がありますが、今回はT

JavaScriptをコードの最下部に配置

SEOの観点からJavaScriptのコードは一番下に記述したいところ

無限スクロールをさせる

TwitterやFacebookのタイムラインを見ていて、ページの下に

PHPExcelの導入

ExcelにDBのデータを表示して一覧を作ったり、請求書などのフォーマ

Warning: SplFileInfo::openFile〜の警告が表示されたら

ShellとWEBの両方で同一のModelを呼び出す時に「Warnin

連結されていないデータを抽出

通常、テーブルを連結してデータを取得するには、アソシエーションを利用し

データを取得する

データを取得したい時に少し変わった条件で取得したい場合があります。

PAGE TOP ↑