2010-12-04 32 views
0

私はLinux上でSymfony 1.4を実行しています。私のアプリケーションは、PDFファイルを作成し、次のディレクトリにファイルを保存: /SRV/WWW /: /SRV/www /のバーチャルホスト/ myappに/ htdocsに/ STMTSここSymfonyルーティングの質問

は、特定のPDFファイルへのパスの例です。バーチャルホスト/ myappの/ htdocsに/ STMTS/example_001.pdf

私のsymfonyは、次のパスにインストールされています: /SRV/www /のバーチャルホスト/ myappに/ htdocsに

私は私のsymfonyアプリケーションからのルートを作成するにはどうすればよいですexample_001.pdfファイル? symfonyアプリケーションのpdfファイルへのリンクを作成したいと思っています。ユーザーがリンクをクリックすると、pdfが開きます。アクションは、実際にファイルを読み込み、コンテンツを送信し

public function executeDownload(sfWebRequest $request) 
{ 
    // assume this method holds the logic for generating or getting a path to the pdf 
    $pdfPath = $this->getOrCreatePdf(); 

    // disbale the layout 
    $this->setLayout(false); 

    $response = $this->getResponse(); 

    // return the binary pdf dat directly int he response as if serving a static pdf file 
    $response->setHttpHeader('Content-Disposition', 'attachment; filename="'. basename($pdfPath)); 
    $response->setContentType('application/pdf'); 
    $response->setContent(file_get_contents($pdfPath)); 

    return sfView::NONE; 
} 

は、あなたがこのような何かをやってする必要が意味をなすためにルートを使用するためにあなた

答えて

4

ありがとうございます。しかし、あなたがこれを行うための正当な理由がない限り、あなたはPHPから不必要なオーバーヘッドが発生するため、それはお勧めできません。

このような制限付きアクセス、動的ファイル名などの理由がある場合は、ファイルシステム上のpdfへのパスを決定するためにそのアクションで使用する必要があるパラメータを決定するだけです通常のルートを設定します。たとえば、人間が認識できるスラッグを使ってファイルを参照するとします。次に、スラグとファイルパスのマッピングを保持するdbレコードがあります。その場合、前のアクションは次のようになります。

public function executeDownload(sfWebRequest $request) 
{ 

    $q = Doctrine_Core::getTable('PdfAsset') 
    ->createQuery('p') 
    ->where('slug = ?', $request->getSlug()); 

    $this->forward404Unless($asset = $q->fetchOne()); 

    $pdfPath = $asset->getPath(); 

    // disbale the layout 
    $this->setLayout(false); 

    $response = $this->getResponse(); 

    // return the binary pdf dat directly in the response as if serving a static pdf file 
    $response->setHttpHeader('Content-Disposition', 'attachment; filename="'. basename($pdfPath)); 
    $response->setContentType('application/pdf'); 
    $response->setContent(file_get_contents($pdfPath)); 

    return sfView::NONE; 
} 

対応するルート探し、何かのようにして:

pdf_asset: 
    url: /download/pdf/:slug 
    params: {module: yourModule, action: 'download'} 

注意ファイルが大きい場合は、fopenの代わりfile_get_contentsとを使用する場合がありますあなたはそれをすべてメモリに置く必要はありませんので、ストリームとしてデータを読んでください。これでビューを使用する必要があります(ただし、レイアウトでストリームデータをラップするのを防ぐには、レイアウトをfalseに設定します)。

+0

私は最初の質問で私が十分にはっきりしていたとは思わない。ディレクトリには、ある種のセキュリティが必要です。理想的には、sfGuardを使用して、このディレクトリ内のpdfファイルを読み取るための認証が必要になります。私はちょうどpdfファイルにhrefを使用して、テンプレートにリンクを貼りたいと思います。私は誰かがpdfファイルの1つにURLを取得し、認証なしでファイルを読むことができないようにしたい。 –

+1

私の追加のコメントを参照してください...他のセキュリティで保護されたアクション(またはsecurity.ymlを使用して設定する)のように、リクエストを処理する前に認証チェックを行ってjsutします。あなたは必ずしもDBを使用する必要はありません。なぜなら、典型的な例であるからです。 – prodigitalson