我有一个关于使用Symfony 2.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
答案 0 :(得分:9)
2013年3月编辑:
大文件不应该遵循此响应, 游戏中有一个新玩家:https://github.com/igorw/IgorwFileServeBundle
它支持SendFile将文件下载委托给Apache / Ngnix,这是更好的。
2013年5月编辑:
令人敬畏的消息:核心内容现已提供内置解决方案:BinaryFileResponse。
OLD回复:
有一个名为StreamedResponse
的新响应类,
它完全符合您的要求,但内存效率更高,并且内核可以很好地处理它。
StreamedResponse表示流式HTTP响应 StreamedResponse对其内容使用回调 回调应该使用像echo这样的标准PHP函数 将响应流回客户端。 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();
答案 1 :(得分:0)
我无法让Damien的解决方案在控制器中工作。
以下是我的工作:
<?php
...
return new StreamedResponse(
function () use ($file) {
readfile($file);
}, 200, array(
'Content-Type' => 'image/png',
'Content-Disposition' => 'inline; filename="filename.png"')
);
信用:http://ailoo.net/2013/03/stream-a-file-with-streamedresponse-in-symfony/