我正在关注Symfony 2网站的上传教程,我将上传到:
web/uploads/{user_salt}/{upload_unique_random_name}.ext
Run Code Online (Sandbox Code Playgroud)
这适用于公共可访问文件.但是我如何保护某些文件呢?例如,在上传表单中,用户可以将文件设置为"公共"或"私有".我该如何处理这种情况?
我不公开公开文件,而是将它们存储在私有位置(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
Run Code Online (Sandbox Code Playgroud)
在你的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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1790 次 |
| 最近记录: |