Symfony2 - 强制文件下载 [英] Symfony2 - Force file download

查看:133
本文介绍了Symfony2 - 强制文件下载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



在控制器中:

  $ 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆