2012-03-31 50 views
1

我想一個PDF重新使用的Symfony 2的瀏覽器,所以一旦我所在的文件與Response對象修改,我用:頭沒有在Symfony2中

return new Response(readfile($file_path), 200, array(
'Content-Type' => 'application/pdf' 
)); 

,但如果我加載頁面,標題不被修改,內容不被解釋爲pdf ...

< HTTP/1.1 200 OK 
< Date: Sat, 31 Mar 2012 20:39:20 GMT 
< Server: Apache 
< X-Powered-By: PHP/5.3.6 
< Set-Cookie: PHPSESSID=XXXX; path=/ 
< Transfer-Encoding: chunked 
< Content-Type: text/html 

我迷失了這個問題。有什麼想法嗎?

回答

7

readfile先執行,然後開始發送文件給客戶端。這會觸發生成頭文件。然後將readfile的返回值傳遞給Response。當Response返回給客戶端時,PHP不能更改標題,因爲它們是在讀取文件運行時觸發的。

file_get_contents代替readfile

+0

的問題是,它加載在內存中的文件,因此它不能被用來下載大文件。有沒有辦法在symfony2中使用'readfile'? – Matthieu 2012-09-14 10:50:36

+0

我沒有看到任何內置的處理。我還沒有嘗試過,但看起來你可以創建一個\ Symfony \ Component \ HttpFoundation \ Response的子類來覆蓋sendContent()來使用readfile。默認的實現需要你將實際的內容傳遞給類,你的子類可能會得到一個文件名。我發現getContent()存在潛在的問題,它會返回實際的內容,但是如果沒有file_get_contents,這將不會成爲一種選擇。 – 2012-09-14 14:27:13

1

你也可以使用帶有`file_get_contents`以下

new StreamedResponse(function() use ($file) { 
    readfile($file); 
}, 200, array('Content-Type' => 'image/png'); 
+0

不錯的一個thx,這裏是使用聲明: 'use \ Symfony \ Component \ HttpFoundation \ StreamedResponse;' – MediaVince 2015-01-07 14:18:24