我在我的symfony2应用程序中使用了一个flash组件,它上传了多个图像,当它们到达服务器时,我想重新打开会话,这样我就可以将图像存储在相对于登录用户的位置。我发送每个文件上传的PHP会话ID ...
在vanilla PHP中,我可以按照......的方式实现这一目标。
session_id($originalSessionId);
session_start();
但使用安全上下文是否有symfony2方法?
编辑:This is a similar question,虽然我想通过传递令牌并使用单独的防火墙保护上传URL来创建某种基于令牌的登录。
答案 0 :(得分:6)
首先,您需要创建自己的会话存储类,如下所示:
<?php
namespace Elao\BackBundle\Session;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage;
class Storage extends NativeSessionStorage
{
public function __construct(array $options = array(), ContainerInterface $container)
{
$request = $container->get('request');
if ($request->query->has('sessionId')) {
$request->cookies->set(session_name(), 1); // We have to simulate this cookie, in order to bypass the "hasPreviousSession" security check
session_id($request->query->get('sessionId'));
}
return parent::__construct($options);
}
}
然后,您必须重新定义默认值(例如,在config.yml中):
parameters:
session.storage.native.class: ElaoBackBundleSessionStorage
services:
session.storage.native:
class: %session.storage.native.class%
arguments: [%session.storage.options%, @service_container]
答案 1 :(得分:3)
当使用SWFUpload允许多文件上传时,我遇到了同样的问题。我做的是修改app [_dev] .php:
if (array_key_exists(ini_get('session.name'), $_GET)) {
$_COOKIE[ini_get('session.name')] = $_GET[ini_get('session.name')];
}
在视图中,我将上传网址设置为
{{ path('...') }}?{{ session.name }}={{ session.value }}
在调用此视图的控制器中,
return $this->render('...html.twig', array(
'session' => array(
'name' => ini_get('session.name'),
'value' => session_id(),
),
));
希望这有帮助!
答案 2 :(得分:1)
您可能知道Symfony将所有请求路由到app或app_dev.php。我会将上传页面的重写规则添加到新的php文件中,如果会话ID在$ _GET变量中,则将其设置为$ _COOKIE,然后包括app.php或app_dev.php。
您也可以保存文件,成功时用户会向服务器发送ajax调用,而不是将这些文件与用户关联。
如果你找到一个不那么黑客的解决方案,请告诉我。
答案 3 :(得分:-1)
你为什么要这个?当用户上传图像时以及当他被重定向到页面时,会话ID应该相同,然后处理它们。 Symfony通常会自动启动您的会话。