symfony 大文件下载
symfony huge file download
我在Symfony2中有controller,提供文件下载。
/**
* @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 中有没有一种方法可以下载大文件而不会耗尽内存?
当然可以。你想使用 Symfony\Component\HttpFoundation\BinaryFileResponse
。
$response = new BinaryFileResponse($filename);
这也会自动为您处理 headers(当然您可以根据需要添加更多 headers)。
使用 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;
它创建了一个我可以下载的大文件。
我在Symfony2中有controller,提供文件下载。
/**
* @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 中有没有一种方法可以下载大文件而不会耗尽内存?
当然可以。你想使用 Symfony\Component\HttpFoundation\BinaryFileResponse
。
$response = new BinaryFileResponse($filename);
这也会自动为您处理 headers(当然您可以根据需要添加更多 headers)。
使用 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;
它创建了一个我可以下载的大文件。