Symfony2.1服务上传

Tny*_*Tny 2 download symfony-2.1

我有一个关于使用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;
}
Run Code Online (Sandbox Code Playgroud)

我上面的代码工作正常,但它是这样做的实际方法吗?使用file_get_contents获取文件是否合适?

谢谢你

Dam*_*ien 9

编辑2013年3月:

对于大文件不应该遵循此响应,游戏中有一个新玩家:https://github.com/igorw/IgorwFileServeBundle

它支持SendFile将文件下载委托给Apache/Ngnix,这样做更好.

编辑2013年5月:

令人敬畏的消息:核心内容现在提供了一个内置解决方案:BinaryFileResponse.


旧的回应:

有一个名为的新响应类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();
Run Code Online (Sandbox Code Playgroud)