« Boot Camp Public Beta | メイン | 不謹慎だとは思うのだけど。 »

Symfonyで画像のアップロード

久しぶりにSymfonyの使い方メモ。画像のアップロードの基礎編。

まずはさくっと、プロジェクトのイニシャライズと、アプリケーション、モジュールの用意。

$ mkdir myproject
$ cd myproject
$ symfony init-project myproject
$ symfony init-app frontend
$ symfony init-module uploadfile

ファイルをアップロードするフォルダと作る。

$ cd web/uploads
$ mkdir web/uploads/files
$ chmod 0777 web/uploads/files

で、actionを書く。

$ vi apps/frontend/modules/uploadfile/actions/actions.class.php
<?php
class uploadfileActions extends sfActions
{
    
/*
        indexはとりあえず放置。
    */
    
public function executeIndex()
    {
    }

    
/*
        update用のアクションを追加。
    */
    
public function executeUpdate()
    {
        
/*
        sfWebRequestクラスのgetFileNameメソッドで
        myfileという名前でファイルを受け取って、
        */
        
if ($file $this->getRequest()->getFileName('myfile'))
        {
            if (!empty(
$file))
            {
            
$file explode("."$file);
            
            
// さっき作ったフォルダに放り込む。
            
$this->getRequest()->moveFile('myfile',
                
'uploads/files/' .$file[0].'.'.$file[1] );
            
            
// 保存したファイルのURLをセッションに放り込む。
            
$this->getUser()->setAttribute('fileurl',
                
$this->getRequest()->getRelativeUrlRoot().'/uploads/img/'.$file[0].'.'.$file[1]);
        }
    }
}
?>

ファイル選択ページとアップロード後ページのビューを用意する。

$ vi apps/frontend/modules/uploadfile/templates/indexSuccess.php
<h1>file uploadのテスト</h1>
<p>以下のフォームから画像ファイルをアップロードしてください。</p>
<?php echo form_tag('uploadfile/update', array('multipart' => true)) ?>
ファイルの選択:<?php echo input_file_tag('myfile'''?>
<?php 
echo submit_tag('アップロード'?>
</form>

アップロード後のビューはこんな感じ。

$ vi apps/frontend/modules/uploadfile/templates/updateSuccess.php
<?php if(!empty($sf_user->getAttribute('fileurl'))) : ?>
uploaded image is ...
<br />
<img src="<?php echo $sf_user->getAttribute('fileurl'?>" />
<br />
タグ
<br /.
<?php echo textarea_tag('introduction' ,'<img src="'.$sf_user->getAttribute('fileurl').'" />', array (
  
'size' => '40x10',
)) 
?>
<?php 
endif ?>


でおしまい。これだけ。

sfWebRequestクラスのgetFileType(string $name)でファイルのmime-typeがとれ、getFileSize (string $name)でファイル容量がとれます。

参考

簡単だー。

あ、でもSymfony使わなくてもmove_uploaded_file関数だけで一発か。

この後の例外処理とかセキュリティ対策とかが意外とちまちましてて面倒ですよね。
そのあたりが楽できないかな。

次回は認証まわりを探ってみます。

トラックバック

このエントリーのトラックバックURL:
http://www.minfish.jp/blog/mt-tb.cgi/105