Symfony2 - 强制文件下载 [英] Symfony2 - Force file download
问题描述
在控制器中:
$ response = new Response();
$ response-> headers-> set('Content-type','application / octect-stream');
$ response-> headers-> set('Content-Disposition',sprintf('attachment; filename =%s',$ filename));
$ response-> headers-> set('Content-Length',filesize($ filename));
return $ response;
这是打开对话框保存文件,但它表示文件是0字节。
并将其更改为:
$ response = new Response();
$ response-> headers-> set('Content-type','application / octect-stream');
$ response-> headers-> set('Content-Disposition',sprintf('attachment; filename =%s',$ filename));
$ response-> headers-> set('Content-Length',filesize($ filename));
$ response-> headers-> set('Content-Transfer-Encoding','binary');
$ response-> setContent(readfile($ filename));
return $ response;
我收到一堆奇怪的字符,而不是文件下载对话框。
最后,将setContent行切换到:
$ response-> setContent的file_get_contents($文件名));
它返回一个PHP错误:
致命错误:允许的内存大小...
有关如何实现这一点的任何线索?
我以前在PHP(wihtout MVC)中完成了,但我不知道通过Symfony2做什么可以丢失...
也许解决方案是在PHP.INI中设置memory_limit,但我猜这不是最好的做法。
首先,感谢大家的回复。我终于解决了这个没有X-SendFile(这可能是最好的做法)。无论如何,对于那些不能让X-Sendfile apache模块工作的人(共享主机),这里有一个解决方案:
/生成响应
$ 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(file_get_contents($ filename));
希望这有帮助!
I'm trying to download a file when a user clicks on download link.
In Controller:
$response = new Response();
$response->headers->set('Content-type', 'application/octect-stream');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->headers->set('Content-Length', filesize($filename));
return $response;
This is opening the dialog box to save the file, but it says the file is 0 bytes. And changing it to:
$response = new Response();
$response->headers->set('Content-type', 'application/octect-stream');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
$response->headers->set('Content-Length', filesize($filename));
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->setContent(readfile($filename));
return $response;
I get a bunch of weird characters instead of the file download dialog box.
Finally, switching the "setContent" line to:
$response->setContent(file_get_contents($filename));
It returns a PHP error:
Fatal error: Allowed memory size...
Any clues on how to achieve this? I've done it before in PHP (wihtout MVC), but I don't know what can be missing to do it through Symfony2...
Maybe the solution is setting the memory_limit in PHP.INI, but I guess it´s not the best practice...
First of all, thanks to everyone for your replies. I finally solved this without X-SendFile (which is probably the best practice). Anyway, for those who can't get X-Sendfile apache module to work (shared hosting), here's a solution:
// Generate response
$response = new Response();
// Set headers
$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));
// Send headers before outputting anything
$response->sendHeaders();
$response->setContent(file_get_contents($filename));
Hope this helps!
这篇关于Symfony2 - 强制文件下载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!