2017-01-16 55 views
2

我控制器下載是基本即成文件作爲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'); 

根據這一doc它的工作原理。當我調用正確的URL時,該文件在當前窗口中打開。

但我不想在瀏覽器中打開文件,我想打開對話框來保存文件。

我該怎麼做?

回答

6

您需要將「content-disposition」標題設置爲attachment

如:

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

不要忘了你的文件的頂部添加此:

use Symfony\Component\HttpFoundation\ResponseHeaderBag; 

...所以PHP知道什麼ResponseHeaderBag是,磁帶自動加載機是能夠找到它。

Linky to docs。

+0

帶有標題(「Content-Disposition:attachment;」);返回之前,它的工作原理,但它是PHP的粗暴... – Macbernie

+0

的確......使用條款更好^^謝謝@yivi我不明白爲什麼silex不會給我一個錯誤 – Macbernie

+1

你沒有得到一個錯誤,因爲使用未定義的類是一個「致命」錯誤,解釋器立即死亡。幾乎可以肯定,你的日誌確實有錯誤。抱歉,我忘記了use語句。我的IDE爲我處理這些東西,我傾向於忘記。 :)(一個合適的IDE應該也提醒你關於未定義的類) – yivi