2

我正在关注 Symfony 2 网站上的上传教程,我将上传到:

web/uploads/{user_salt}/{upload_unique_random_name}.ext

这对于公共可访问文件来说很好。但是如何保护某些文件?例如,在上传表单中,用户可以将文件设为“公开”或“私有”。我应该如何处理这种情况?

4

1 回答 1

7

我不会公开文件,而是将它们存储在私有位置(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中,您将有一个AssetsControllerwithserve操作:

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
    }
}
于 2012-08-08T18:37:59.827 回答