2010-12-04 13 views
0

Ich verwende Symfony 1.4 unter Linux. PDF-Dateien und speichert die Dateien im folgenden Verzeichnis Meine Anwendung erstellt: /srv/www/vhosts/myapp/htdocs/stmtsSymfony Routing Frage

Hier ist ein Beispiel für den Pfad zu einer bestimmten PDF-Datei: /srv/www/vhosts/myapp/htdocs/stmts/example_001.pdf

Mein symfony in folgendem Pfad installiert ist: /srv/www/vhosts/myapp/htdocs

Wie kann ich eine Strecke von meinem symfony-Anwendung erstellen die Datei beispiel_001.pdf? Ich möchte einen Link in meiner Symfony-Anwendung auf die PDF-Datei erstellen können. Wenn ein Benutzer auf den Link klickt, wird das PDF geöffnet.

Danke

Antwort

4

Um eine Route für die Verwendung von Sinn machen würden Sie so etwas wie dieses benötigen, zu tun:

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; 
} 

Diese Aktion würde die Datei tatsächlich lesen und den Inhalt senden. Aber es sei denn, Sie haben einen guten Grund, dies zu tun, es ist nicht ratsam, weil Sie unnötige Overhead von PHP bekommen.

Wenn Sie einen guten Grund dafür haben (eingeschränkter Zugriff, dynamische Dateinamen usw.), dann würden Sie einfach bestimmen, welche Parameter Sie in dieser Aktion verwenden müssen, um den Pfad zum PDF im Dateisystem zu bestimmen und richten Sie eine normale Route ein. Nehmen wir zum Beispiel an, Sie verwenden einen menschlichen erkennbaren Slug, um auf die Datei zu verweisen. Dann haben Sie einen DB-Datensatz, der eine Zuordnung von Slug zu Dateipfad enthält. In diesem Fall könnte die vorhergehende Aktion wie folgt aussehen:

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; 
} 

Mit der entsprechenden Route suchen so etwas wie:

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

Hinweis, wenn die Dateien groß sind Sie fopen statt file_get_contents verwenden möchte und dann lese die Daten als Stream aus, so dass du sie nicht im Speicher ablegen musst. Dies würde jedoch erfordern, dass Sie eine Ansicht verwenden (aber Sie würden trotzdem das Layout auf "false" setzen, um zu verhindern, dass das Layout Ihre gestreamten Daten umhüllt).

+0

Ich glaube nicht, dass ich in meiner anfänglichen Frage klar genug war. Das Verzeichnis muss eine Art von Sicherheit haben. Im Idealfall möchte ich sfGuard verwenden, um eine Authentifizierung zu verlangen, um eine der PDF-Dateien in diesem Verzeichnis zu lesen. Ich möchte einfach eine href zu den pdf-Dateien verwenden und die Links auf eine Vorlage setzen. Ich möchte nicht, dass jemand eine URL zu einer der PDF-Dateien erhält und dann die Datei ohne Authentifizierung lesen kann. –

+1

siehe meine zusätzlichen Kommentare ... Sie würden nur durch ein Auth-Check-in, bevor Sie die Anfrage verarbeiten, wie Sie mit einer anderen gesicherten Aktion (oder verwenden Sie security.yml, um es zu konfigurieren). Sie müssen nicht unbedingt die DB verwenden, die ich gerade verwendet habe, um den Punkt zu veranschaulichen, weil es ein typisches Beispiel ist. – prodigitalson