在Symfony

时间:2018-02-19 12:42:58

标签: symfony symfony-2.8

我正在开发一个Symfony 2.8项目,我想让用户通过表单上传文件。这些文件不公开(如个人头像或其他内容),所以我不想将它们放在web/下,上传后只允许管理员知道它们的位置并通过网站的管理界面。在实际捆绑包中的源代码附近移动上传的文件对我来说听起来不对...那么是否有任何官方或推荐的路径来移动仍在项目根目录下的上传文件?

2 个答案:

答案 0 :(得分:1)

如果您的要求是上传的文件只能由授权人员下载,那么您必须明确地将它们保留在web根之外。外面的任何目录都可以,但是它们也应该保留在代码库之外。

例如,您可以在项目根目录中创建data目录。您可以事件安装NFS / S3共享,您可以选择该选项。

要允许下载文件,您可以创建一个控制器,该控制器仅为授权请求提供文件。示例控制器(基于PHP7):

final class DownloadController extends Controller
{
    /**
     * @Route("/download/{path}", requirements={"path"=".+"}, name="download")
     * @Method("GET")
     * @Security("is_granted('FILE_DOWNLOAD', path)")
     */
    public function __invoke(string $path): Response
    {
        return $this->file($yourUploadBasePath . $path);
    }
}

答案 1 :(得分:0)

您可以在项目根目录中创建datauploads目录,或者如果您的服务器是nginx并且您可以控制Web服务器配置,则可以使用http_auth_request模块: https://nginx.org/en/docs/http/ngx_http_auth_request_module.html

然后,如果您尝试访问该文件,nginx会对您的应用程序执行子请求,如果您的应用程序返回2xx状态代码以外的任何内容,则拒绝访问该文件。

这种方法的缺点是,如果您更换网络服务器或在配置中出现一些错误,那么这些文件将被公开曝光。