2009年2月6日金曜日

[symfony 1.0.18]symfonyでファイルアップ&ダウンロード

ちょっと興味本位でファイルのアップロード・ダウンロードができるアプリを作ってみた。
後悔はしていない。

ジェネレーターで作ったので所々はしょってますが、ちょー簡単な作りです。

まずファイルアップロード
自分は、DBにはファイル名と拡張子とサイズしか入れませんでした。
中身はuploadsに直接保存しています。

まずテンプレート内で

を組み込む。これだけでファイル選択のボタンが作成されます。

次にアクション内で
普通にDBに保存する値をセットしていき、
$this->getRequest()->moveFile('file',
sfConfig::get('sf_upload_dir').'ファイルへのパス);

を組み込む。moveFile()の第2引数には保存するパスを指定しています。
saveされたらuploadsの下を見てみましょう。
アップロードについては他のブログでも紹介されてるけど、
意外とダウンロードは難しいらしくあまり紹介されてない。

てことでダウンロードを実装します。
まず自分はファイルの一覧を作りました。
data/listSuccess.php みたいな。
そこにファイル名の横にダウンロードのリンクを作成し、
飛んだ先のアクションで直にダウンロードが始まるようにしました。
まずアクション
 public function executeDownload() {
  $data = DataPeer::retrieveByPk($this->getRequestParameter('id'));
  $file_path = sfConfig::get('sf_upload_dir').'ファイルへのパス';
  $file_name = 'ファイル名';
  $this->getResponse()->addHttpMeta('Content-Type',
'application/octet-stream; name='.$file_name);
  $this->getResponse()->addHttpMeta('Content-Disposition',
'attachment; filename='.$file_name);
  $this->getResponse()->addHttpMeta('Content-Length', ファイルサイズ);
  $this->send_data = fread(fopen($file_path, 'rb'), ファイルサイズ);
 }

まず、日本語で書いてある所は人によって入るものが違います。
最後の$this->send_data には実際のファイルデータが入っていて、テンプレートに渡しています。

そしてテンプレート
data/downloadSuccess.php
<?php echo $send_data ?>


これだけでアップロード・ダウンロードができるようになりました☆
気をつけなければならないのは、最後のdownloadSuccess.phpのlayout.phpを外す事です。
HTML要素が入っているとファイルの中身が壊れてしまうので注意です。

ジェネレーター最高^p^