ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  CakePHP 2.x >  CakePHP 2.3でファイルのアップロード処理を作る

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

CakePHP 2.3でファイルのアップロード処理を作る

CakePHP2.3でプログラム開発を行っていますが、ファイルのアップロード処理についてググっていたら、下記のサイトに行き当りました。
ほほー。ファイルアップロードにも Pluginがあるのか、と思ったものの、このページではプラグインに頼らない、と書いてありましたので、私も頼らずに実際に作ってみることにしました。(記事が書かれたのが 2011年2月ですので、その後のバージョンアップなどでどうなったかは分かりませんが。)
http://lambdagroove.blogspot.jp/2011/02/cakephp.html

簡単なファイルのアップロードであれば下記のページに従って作っていけば、簡単に出来上がります。
http://www.almondlab.jp/labs/1043

上記の方法では、実運用に際してファイルの削除処理などが必要になってくると思います。

また、ファイルの管理を煩雑にしないために、画像などのファイル情報を DBに保存したい、という場合もあるかと思います。
その場合は、下記のページが参考になりました。
http://c-brains.jp/blog/wsg/10/06/05-074544.php

ですが、このページの通りに作っていくと、「Viewファイルの記述がおかしい」というエラーになってしまいましたので、その前に作った簡易フォームのスクリプトを借りることにしました。
(CakePHP 2.0では echoのエイリアスである e()が使えなくなっていますので、そのほかの不具合もバージョンの違いによるものと思われます。)

また、ファイルが jpeg固定でしたので、それを可変にし、ついでに元ファイルのファイル名、ファイルサイズといった情報も取得するために、テーブルを拡張したり、そのままではうまく画像が呼び出せなかったために、画像の確認するためのファイルなどを作りましたので、あわせてそちらも紹介いたします。


--------------(テーブル)
CREATE TABLE `images` ( 
  `id`            int(11)     NOT NULL AUTO_INCREMENT, 
  `filename`      varchar(60) NOT NULL, 
  `contents`      mediumblob  NOT NULL, 
  `moto_filename` text        NOT NULL, 
  `filetype`      text        NOT NULL, 
  `filesize`      int(11)     NOT NULL, 
  PRIMARY KEY (`id`) 
); 
--------------


--------------(/View/Images/index.ctp)
<?php echo $this->Form->create('Image', array('action' => 'add', 'type' => 'file')); ?>
<?php echo __('Add Image'); ?> <?php echo $this->Form->file('image'); ?>
<?php echo $this->Form->end(__('画像を追加'));?>

<?php echo __('Images'); ?>

<?php foreach ($images as $image) : ?> <?php endforeach; ?>
<?php echo __('id'); ?> <?php echo __('file_name'); ?> <?php echo __('contents'); ?>
<?php echo h($image['Image']['id']); ?> <?php echo h($image['Image']['filename']); ?> <?php echo $this -> Html->link(__("/images/contents/{$image['Image']['filename']}"), array('action' => "/contents/{$image['Image']['filename']}" ), array ( 'target' => '_blank' ) ); ?>
--------------


/View/Images/contents.ctp は、ないとエラーになりますので作成する必要がありますが、中身は空のファイルになります。

--------------(/View/Images/contents.ctp)
--------------


/Controller/ImagesController.php は、以下のようになります。
それぞれの処理の解説は、参考にしたバシャログさんのサイトを見ていただく方が分かりいいかと思います。

--------------(/Controller/ImagesController.php)
<?php
class ImagesController extends AppController {

  public $helpers    = array ( 'Html', 'Form', 'Session' );
  public $components = array ( 'Session' );


  var $uses = array('Image');
  function index(){
    $images = $this->Image->find('all');
    $this->set(compact('images'));
  }

  /**
   * 画像を登録する
   */
  function add(){
    $limit = 1024 * 1024;
    debug($this->data);

    // 画像の容量チェック
    if ($this->data['Image']['image']['size'] > $limit){
      $this->Session->setFlash('1MB以内の画像が登録可能です。');
      $this->redirect('index');
    }
    // アップロードされた画像か
    if (!is_uploaded_file($this->data['Image']['image']['tmp_name'])){
      $this->Session->setFlash('アップロードされた画像ではありません。');
      $this->redirect('index');
    }
    // 保存
    $image = array(
      'Image' => array(
        'filename' => md5(microtime()) . '.' . $extension = end(explode('.', $this->data['Image']['image']['name'])),
        'contents'      => file_get_contents($this->data['Image']['image']['tmp_name']),
        'moto_filename' => $this->data['Image']['image']['name'],
        'filetype'      => $this->data['Image']['image']['type'],
        'filesize'      => $this->data['Image']['image']['size'],
      )
    );
    $this->Image->save($image);
    $this->Session->setFlash('画像をアップロードしました。');
    $this->redirect('index');
  }


  function contents($filename) {
    $this->layout = false;
    $image = $this->Image->findByFilename($filename);
    if (empty($image)) {
      $this->cakeError('error404');
    }
    header('Content-type: ' . $image['Image']['filetype'] );
    echo $image['Image']['contents'];
  }
}
--------------

また、今回追加した MIMEタイプなどの情報は、下記サイトを参考にして作成しました。
http://vitafacio.sakura.ne.jp/wordpress/?p=35


また、http://localhost/cake/images/contents/xxxxxxxx.jpg のような形式では文字化けしたような文字が表示され、なぜかうまく表示されずさんざん悩んだのですが、それを改善させる方法を見つけることはできませんでした。
PDFや、csvファイルは問題なく表示されますが、jpeg、gifなどの画像ファイルが正しく表示されないという不具合でしたので、おそらく「header('Content-type:.......」の出力部分がうまく処理されていないのだろうと思うのですが...


ただ、実際の使用方法に近い記述の方法で確認したところ、正しく表示されましたので、それで良しとしたところもあります。

--------------(/webroot/test.php)
<img src="./images/contents/xxxxxxxx.jpg">
--------------

上記のファイルを作成し、webrootにおいてアクセスすると画像ファイルも無事に表示されましたので、画像も正しくアップロードされていることが確認できました。
関連記事
スポンサーサイト
[ 2013年07月01日 07:18 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。