我正在关注Symfony 2网站上的upload tutorial,我将上传到:
web/uploads/{user_salt}/{upload_unique_random_name}.ext
这适用于公共可访问文件。但是我如何保护某些文件呢?例如,在上传表单中,用户可以将文件设置为“公共”或“私有”。我应该如何处理这种情况?
答案 0 :(得分:7)
我不会公开公开文件,而是将它们存储在私有位置(web
目录之外),创建一个Bundle和一个Controller,并且在控制器中有一个动作需要一个文件ID并从数据库表中查找其访问级别。如果文件可公开访问,请提供服务。如果没有,请确保用户有权查看该文件。
您只需要创建一个File
实体,以及一个存储针对这些文件的用户或用户角色权限的表,以便您可以根据请求对它们进行交叉检查。
它会增加一些服务文件的开销,因为需要发生完整的Symfony2请求,而直接通过apache或nginx提供文件将不会产生框架堆栈的开销。
希望我已经解释得那么好了。
编辑:
如果您通过使用令牌(例如通过电子邮件)提供这些图片,那么您可以按照以下方式执行某些操作......
示例图片src
属性:http://yourdomain.com/assets/12/TOKEN
此路由配置看起来像这样(在YAML中):
assets_serve:
pattern: /assets/{id}/{token}
defaults: { _controller: AcmeAssetBundle:Assets:serve }
requirements:
_method: GET
在AcmeAssetBundle
中,您将AssetsController
行动serve
:
class AssetController extends Controller
{
public function serveAction($id, $token = null)
{
//fetch asset record from the database -- which also contains its file path
//check the TOKEN matches the one stored against this image
//set content-type headers and serve the image
}
}