ZFアプリケーションがログインしているユーザーに吐き出すことができるアップロードされたドキュメントを含むフォルダーがあります。のようなリンクを使用しhttp://server/documents/filename.pdf
てファイルをダウンロードできるようにしたいのですがDocumentsController
、既存のユーザーCookieがログインしていて、ファイルをダウンロードする権限があることを確認できるコントローラーが必要です。http://server/documents/index/id/1
ひどいオプションではありませんが、必要がない場合のようにURLを使用する必要はありません。
2 に答える
X-SendFileを使用して、最高のパフォーマンスを得ることができます。Apache(mod_xsendfile)、Lighttpd、Nginxでサポートされています。リクエストは、最初に特別なヘッダー(Nginxの場合はX-SendfileまたはX-Accel-Redirect)を配置するphpプロセスによって処理され、スクリプトが終了すると、Webサーバーが引き継いで静的ファイルのようにファイルを送信します。それはより速く、より少ないメモリを使用します。
すべてのリクエストをコントローラーにリダイレクトするには、ブートストラップにカスタムルートを作成する必要があります。
protected function _initRouter()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$documentRoute = new Zend_Controller_Router_Route(
'document/:filename',
array(
'action' => 'xsendfile',
'controller' => 'documents'
),
array(
'filename' => '\..+$'
)
);
$router->addRoute('document', $documentRoute );
return $router;
}
このアクションヘルパーを使用して、x-sendfileヘッダーを処理できます:http ://www.zfsnippets.com/snippets/view/id/27そして、ユーザーが認証されているかどうかを確認するためのコードが必要です。
Zend_Aclを使用してへのアクセスを制御してから、にリダイレクトするカスタムルートを作成するDocumentsController
必要があります。http://server/documents/*
http://server/documents/index/id/*
編集:
Tomášによって提案されたソリューションは、より大きなファイルに対してより適切に機能します。