当然のことながら、他の何人かの人々はスタックオーバーフローでこれらの問題について議論しましたが、すべての回答が私のために働くわけではなく、しばしば彼らはそこのsymfonyインストールのバージョンを提供しません。
私が読んだトピック:
- 添付ファイルの送信/Symfonyアクションからのファイルのダウンロード
- PHP-Symfonyを使用してファイルパスをクリックしてファイルをダウンロードするにはどうすればよいですか?
- symfony:setHttpHeader()は機能しませんが、header()は機能します
それが、symfony 1.4で(ビューを使用せずに)ファイルのダウンロードをどのように処理するかを尋ねるポイントですか?すべてのユースケースで、応答をレンダリングするためのテンプレートファイルが必要です。コントローラに起因する応答を送信する場合、phpエラーなしで応答を送信する唯一の可能性があります(ヘッダーはすでに送信されています)。
コントローラ:
/** @var $response sfWebResponse */
$response = $this->getResponse();
$response->clearHttpHeaders();
$response->setContentType($mimeType);
$response->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($filePath) . '"');
$response->setHttpHeader('Content-Description', 'File Transfer');
$response->setHttpHeader('Content-Transfer-Encoding', 'binary');
$response->setHttpHeader('Content-Length', filesize($filePath));
$response->setHttpHeader('Cache-Control', 'public, must-revalidate');
$response->setHttpHeader('Pragma', 'public');
$response->sendHttpHeaders();
readfile($filePath); die();
これは、テンプレートファイルなしで機能します。しかし、これはそれほどきれいなコーディングではありません。
テンプレートを使用した別の方法:
コントローラ:
/** @var $response sfWebResponse */
$response = $this->getResponse();
$response->clearHttpHeaders();
$response->setContentType($mimeType);
$response->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($filePath) . '"');
$response->setHttpHeader('Content-Description', 'File Transfer');
$response->setHttpHeader('Content-Transfer-Encoding', 'binary');
$response->setHttpHeader('Content-Length', filesize($filePath));
$response->setHttpHeader('Cache-Control', 'public, must-revalidate');
$response->setHttpHeader('Pragma', 'public');
$response->setContent(file_get_contents($filePath));
$response->sendHttpHeaders();
return sfView::NONE;
見る:
<?php echo $sf_response->getRawValue()->getContent(); ?>