ここでは、Zend Framework の Zend_File_Transfer クラスを利用したファイルのアップロードとファイルのダウンロードを行うサンプルスクリプトを掲載しています。
スポンサーリンク
サンプルで使用する HTML ファイル
ファイルのアップロードのサンプルは、以下の HTML を使用しています。ファイルを3つ設定してアップロードを行うことができます。
<form enctype="multipart/form-data" action="/fileupload/receive" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
アップロードするファイルを選択:
<input name="uf1" type="file" />
<input name="uf2" type="file" />
<input name="uf3" type="file" />
<input type="submit" value="アップロード" />
</form>
Zend_File_Transfer によるファイルのアップロード
ファイルのアップロードを行うサンプルになります。詳細はサンプル内のコメントを参照ください。
class FileUploadController extends Zend_Controller_Action
{
public function receiveAction()
{
$upload = new Zend_File_Transfer();
// ファイル名未設定の場合は無視するようにする
$upload->setOptions(array('ignoreNoFile' => true));
// ファイル名チェックのバリデータを作成
$validator = new Zend_Validate_Regex(array('pattern' => '/^success/'));
// アップロードされたファイル情報を取得する
$files = $upload->getFileInfo();
// デフォルトの保存先を設定する
$upload->setDestination('D:\\temp');
foreach ($files as $file => $info) {
// アップロードファイルが指定されていない場合はスキップ
if (!$upload->isUploaded($file)) {
continue;
}
// ファイル名によって振り分け先を設定する
if ($validator->isValid($info['name'])) {
$upload->setDestination('D:\\temp\\success', $file);
} else {
$upload->setDestination('D:\\temp\\error', $file);
}
}
// ファイルを受信する(テンポラリフォルダからファイルをコピーする)
if (!$upload->receive()) {
$messages = $upload->getMessages();
echo implode("\n", $messages);
}
}
}
ポイント解説
- isUploaded では、ブラウザから存在しないファイルを指定してアップロードしても サイズ 0 のファイルがアップロードされたと判断される
- setOptions によって ignoreNoFile オプションを設定しないと、アップロードファイルが 3つすべて設定されていないとエラーになる
- 振り分け先を変更した場合、1つでも振り分け先のディレクトリが存在しないとすべてのファイルのアップロードが失敗する
ファイルのダウンロード
ファイルのダウンロードを行うサンプルになります。詳細はサンプル中のコメントを参照ください。
public function downloadAction()
{
//
$this->_helper->viewRenderer->setNoRender();
$dlFilePath = "path/to/download.tar.gz"; // ダウンロードするファイルパス
$dlFileName = "name.tar.gz"; // ダウンロードファイル名
// ヘッダの設定
$this->getResponse()->setHeader('Content-type', 'application/octet-stream');
$this->getResponse()->setHeader('Content-Disposition', 'attachment; filename=' . $dlFileName);
$this->getResponse()->setHeader('Content-length', filesize($dlFilePath));
// ヘッダの送信
$this->getResponse()->sendHeaders();
// 出力バッファを無効にする。
ob_end_clean();
// 再度バッファリングを有効にする場合は記述する。
//ob_start(null, 81920);
/*
* readfile() 関数などで一度にファイルを読み込むとメモリ不足エラーと
* なるので少しずつ出力する
*/
$fhandle = fopen($dlFilePath, 'rb');
while (!feof($fhandle)) {
// body にセットし、出力する
$this->getResponse()->setBody(fread($fhandle, 8192));
$this->getResponse()->outputBody();
// 上記2行は、以下の処理と等価である
//echo implode('', fread($fhandle, 8192));
}
fclose($fhandle);
}
ob_end_clean 関数によって出力バッファを一旦オフに しないと、少なくとも IE6 ではダウンロードが開始されませんでした。なお、Zend Framework のデフォルト(disableOutputBuffering パラメータ未設定)では、ディスパッチャによって 出力バッファリングがオンになっています。