我正在关注 Symfony 2 网站上的上传教程,我将上传到:
web/uploads/{user_salt}/{upload_unique_random_name}.ext
这对于公共可访问文件来说很好。但是如何保护某些文件?例如,在上传表单中,用户可以将文件设为“公开”或“私有”。我应该如何处理这种情况?
我不会公开文件,而是将它们存储在私有位置(web
目录外),创建一个 Bundle 和一个控制器,并在控制器中有一个操作,该操作采用文件 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
withserve
操作:
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
}
}