2012-03-30 52 views
8

在我的Symfony 2项目中,我有一个页面显示有关实体的信息。在这个页面上还有一个指向与这个实体关联的文件的链接。确保Symfony 2中的下载链接

页面是安全的,只有在用户是特定角色时才能显示。预期的角色对于每个实体都不相同,因此它在动作中进行了动态测试。

我的问题是即使页面是安全的,任何人都可以通过它的URL访问文件。只有当角色与页面显示的角色相匹配时,我才希望它可以下载。

任何有关我应该怎么做,或从哪里开始寻找的建议?

+6

移动文件的Web根目录之外,然后将其发送到使用'ReadFile的()'的用户,如果他们符合安全要求下载文件。 – halfer 2012-03-30 08:50:49

回答

14

将文件移动到公共目录之外,因此无法通过URL访问该文件。在控制器中,如果用户拥有正确的权限,则允许用户下载该文件。

你可以在你的控制器使用:

$headers = array('Content-Type'  => 'application/pdf', 
       'Content-Disposition' => 'inline; filename="file1.pdf"'); 

return new Response(file_get_contents($file), 200, $headers); 
+1

谢谢我在发布这个问题几个小时后也想到了这个实现。感谢无论如何,它肯定是最好的方式来做到这一点! – skwi 2012-03-30 14:00:05

+2

上述代码的一种改进是使用StreamedResponse将内容作为正文SF 2.1的一部分输出:http://symfony.com/doc/current/components/http_foundation.html#streaming-a-response – Josiah 2012-04-01 13:52:47

+0

您应该始终使用它,因为使用上面的代码需要具有与$ file文件大小一样多的内存 – 2017-10-23 10:24:28