symfony巨大的文件下载

时间:2015-03-16 16:11:37

标签: php file symfony download

我在Symfony2中有控制器,它提供文件下载。

/**
 * @Route("/polynomy/download/{polynomialId}", name="download_polynomial")
 */
public function polynomialDownloadAction( $polynomialId ) {
    $em = $this->get('doctrine')->getManager();
    $polynomial = $em->getRepository('AppBundle:Polynomial')->findById($polynomialId);
    $filename = $polynomial->getFileLocation();

    $response = new Response();
    $response->headers->set('Cache-Control', 'private');
    $response->headers->set('Content-type', mime_content_type($filename));
    $response->headers->set('Content-Disposition', 'attachment; filename="'.basename($filename).'";');
    $response->headers->set('Content-length', filesize($filename));
    $response->sendHeaders();

    $response->setContent(readfile($filename));

    return $this->redirect($this->generateUrl('users_polynomials'));
}

这项工作适用于小文件(<100MB)。但如果我想下载大于100MB的文件,我会收到错误(ERR_INVALID_RESPONSE)。 我发现,问题可能出在php函数readfile()中,导致内存耗尽。

在Symfony 2.6.1中是否有办法如何在没有内存耗尽的情况下下载大文件?

2 个答案:

答案 0 :(得分:2)

不确定。您想使用Symfony\Component\HttpFoundation\BinaryFileResponse

$response = new BinaryFileResponse($filename);

这也将自动为您处理标题(当然,如果需要,您可以添加更多标题)。

答案 1 :(得分:-2)

使用symphony下载大文件。此代码流式传输文件。

$response = new StreamedResponse();  
$i = -999999;  
$response->setCallback(function () {  
    while($i < 999999){  
        echo '{"G1ello":"hualala"}';  
        $i = $i + 1;  
    }  
});  
$filename = "Data.json";  
$contentDisposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename);
$response->headers->set('Content-Type', 'application/json');
$response->headers->set('Content-Disposition', $contentDisposition);
return $response;

它创建了一个我可以下载的大文件。