2017-01-16 3 views
2

Mein Controller ist einfachServe-Datei als Download mit Silex

$app->get('/files/{type}', function ($type) use ($app) { 

    $path = __DIR__ . "/../files/$type"; 

    if (!file_exists($path)) { 
     $app->abort(404, "Ce fichier n'existe pas."); 
    } 

    return $app 
     ->sendFile($path) 
    ; 
})->bind('getfile'); 

Nach diesem doc es funktioniert. Wenn ich eine korrekte URL anrufe, ist die Datei im aktuellen Fenster geöffnet.

Aber ich möchte nicht die Datei im Browser öffnen, ich möchte das Dialogfeld öffnen, um nur die Datei zu speichern.

Wie kann ich das tun?

Antwort

6

Sie müssen den Header "content-disposition" auf attachment setzen.

ZB:

return $app 
    ->sendFile($path) 
    ->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 
basename($path)); 

das nicht am Anfang der Datei hinzufügen Vergessen:

use Symfony\Component\HttpFoundation\ResponseHeaderBag; 

... so PHP weiß, was ResponseHeaderBag ist, und der Autoloader in der Lage, finde es.

Linky zu Dok.

+0

mit einem Header ("Content-Disposition: Anhang;"); vor der Rückkehr, es funktioniert, aber es ist php brut ... – Macbernie

+0

In der Tat ... Es ist besser mit der Verwendung Klausel ^^ danke @ yivi Ich verstehe nicht, warum Silex gibt mir keinen Fehler – Macbernie

+1

Sie nicht einen Fehler erhalten, weil die Verwendung einer nicht definierten Klasse ein "FATAL" -Fehler ist, der Interpreter stirbt sofort. Fast sicher, Sie hatten einen Fehler in Ihrem Protokoll. Tut mir leid, ich habe die Anweisung 'use' vergessen. Meine IDE behandelt das Zeug für mich und ich vergesse es zu vergessen. :) (Eine korrekte IDE sollte Sie auch vor der undefinierten Klasse gewarnt haben) – yivi