2012-08-15 35 views
2

我有一個關於與Symfony的2.1Symfony2.1即成上傳

public function exampleFileAction(){ 
    $response = new Response(); 

    $d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'File.xls'); 

    $response->setContent(file_get_contents('../uploads/Bundle/Files/File.xls')); 
    $response->headers->set('Content-Disposition', $d); 
    return $response; 
} 

我上面的代碼工作正常投放文件的問題,但它是實際的辦法做這樣的? 用file_get_contents獲取文件很好嗎?

感謝 TNY

+2

你真的應該接受達明的答案,因爲它是正確的解決方案 - 卡瑪花花公子 – frak 2012-09-25 14:25:58

回答

9

編輯2013年3月

這個響應後,不應在大文件, 有在遊戲中一個新的球員:https://github.com/igorw/IgorwFileServeBundle

它支持SENDFILE到將文件下載委託給Apache/Ngnix,這樣更好。

編輯2013年5月

真棒消息:在解決方案構建現已核心:BinaryFileResponse


舊響應:

有一個名爲StreamedResponse新Response類, 它正是你正在嘗試做的,但更多的內存高效,深受內核處理。

StreamedResponse表示流式HTTP響應。
StreamedResponse對其內容使用回調。
回調應該使用標準的PHP函數,例如echo 來將響應傳輸回客戶端。如果需要,也可以使用flush()方法 。

http://symfony.com/doc/master/components/http_foundation/introduction.html#streaming-a-response

因此,對於一個大的文件,你可以不用file_get_content:

<?php 
use Symfony\Component\HttpFoundation\StreamedResponse; 
use Symfony\Component\HttpFoundation\ResponseHeaderBag; 

$response = new StreamedResponse(); 
$response->setCallback(function() { 
    $name = 'bigfile.pdf'; 
    $fp = fopen($name, 'rb'); 
    fpassthru($fp); 
}); 
$d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'foo.pdf'); 
$response->headers->set('Content-Disposition', $d); 
$response->send(); 
+0

我無法得到服務的PDF文件作爲blob存儲在mysql中而不是目錄中的文件。 – 2012-11-12 02:23:26

+0

不要忘記使用Symfony \ Component \ HttpFoundation \ ResponseHeaderBag; – Gigala 2013-01-31 13:35:21

+0

編輯回覆,謝謝。 – Damien 2013-01-31 15:23:26