Symfony1.4で、ファイル(CSV)アップロードのサンプル

Symfony1.4環境で、ファイル(CSV)のアップロード環境を構築することがあったので、そのメモ。
実際には、CSVからDBのCRUDを行った。

では、早速サンプルソース

  • vim lib/form/myFileUpload.class.php
    <?php
    class myFileUploadForm extends sfForm
    {
        public function configure()
        {
            // widget
            $this->widgetSchema['csv'] = new sfWidgetFormInputFIle(array(
                'label' => 'アップロード'
            ));
            // label
            $this->widgetSchema->setNameFormat('file[%s]');
    
            // post validator
            $this->validatorSchema['csv'] = new sfValidatorFile(
                array(
                    'required'      => false,
                    'path'          => 'uploads/',
                    'mime_types'    => array('text/plain'),
                ));
        }
    }
    

    – vim apps/frontend/modules/user/templates/listSuccess.php

    <?php if ($sf_user->hasFlash('error')) : ?></li>
    </ul>
    
    <div class="error_list"><?php echo $sf_user->getFlash('error') ?></div>
    
    <?php endif ?>
    
    <form action="<?php echo url_for('user/upload') ?>" method="post" enctype="multipart/form-data" >
        <?php echo $form ?>
        <input type="submit" value="CSVアップロード">
    </form>
    
    
    • vim apps/frontend/modules/user/actions/actions.class.php
      public function executeUpload(sfWebRequest $request)
      {
      
      <pre><code>if ($request-&gt;isMethod('post')) {
          // フォームインスタンス生成後、bind
          $form = new myFileUploadForm();
          $form-&gt;bind($request-&gt;getParameter($form-&gt;getName()), $request-&gt;getFiles('file'));
      
          // validチェック
          if ($form-&gt;isValid()) {
              $file = $form-&gt;getValue('csv');
              $filepath = 'uploads/'. $file-&gt;getOriginalName();
      
              if ($file-&gt;getOriginalName() == 'user.csv') {
      
                  // ファイル保存
                  $file-&gt;save($filepath);
      
                  // csvファイルから、レコード更新&追加
                  ....
              } else {
                  $this-&gt;getUser()-&gt;setFlash('error', 'アップロードするファイルは、"user.csv"としてアップロードしてください');
                  $this-&gt;redirect('user/list');
              }
          }
      
          $this-&gt;redirect('user/list');
      }
      </code></pre>
      
      }
      

    と、こんな感じで実装。
    アップロード用ディレクトリのパーミッションを、書き込み可能にしておけば完了。
    案外情報が少なかったので、コードを掲載してみた。
    実運用では、ファイルサイズやCSVの各カラム、Validateチェックなどもあるのでこれだけでは終わらないけれど…