uploadfiy (swfupload) + CI sessions DB + session_data

Вопросы об установке, настройке и работе самого фреймворка

uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение molodoy » 26 окт 2009, 19:10

Доброго вечера, коллеги.
Столкнулся с такой проблемой:
использую стандартный класс CI_session, храню данные в базе.
хочу прикрутить мульти-загрузку фотографий для авторизованных пользователей с использованием uploadify.
Никак не могу понять, как мне передать пользовательские куки в контроллер, обрабатывающий загрузку, чтобы проверить авторизован ли юзер и в свой ли альбом он загружает фотки.
Обгуглился, нашел решение с передачей session_id через GET, но этот вариант отпал из-за того, что сессии хранятся в базе и session_id вообще пустой.

Написано 99% проекта и сейчас менять что-то, что потянет за собой изменения по всему коду не хотелось бы.

Искренне надеюсь, что кто-то уже решал подобную проблему и сможет мне подсказать.
Спасибо заранее.
molodoy
 
Сообщения: 2
Зарегистрирован: 26 окт 2009, 19:02

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение bobo » 26 окт 2009, 22:40

Если данные сессии находятся в базе данных, то каждый раз, когда в cookies пользователя обнаруживается рабочая сессия, осуществляется запрос к базе данных - с целью сравнить ID сессий. Если ID сессии не совпадают, то сессия разрушается. ID сессии никогда не обновляется, он может быть лишь сгенерированным, когда сессия создается.
bobo
 
Сообщения: 26
Зарегистрирован: 17 янв 2009, 05:06

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение molodoy » 27 окт 2009, 13:27

Ага, про куки я понял еще вчера.
С утра попробовал передавать куки через POST.
Библиотеку сессий переписал соответственно,
Код: Выделить всё
function sess_read()
    {
        
// Fetch the cookie
        
$session $this->CI->input->cookie($this->sess_cookie_name);

        if (
$session === false AND (strstr($this->CI->input->server('USER_AGENT'),'shockwave') or strstr($this->CI->input->server('USER_AGENT'),'Adobe Flash'))) {
            
$session url_decode($this->CI->input->post('cookie'));
        }
 

Но, по логам, куки приходят какие-то неправильные. Все знаки "+" заменены пробелами :(
molodoy
 
Сообщения: 2
Зарегистрирован: 26 окт 2009, 19:02

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение insaner » 27 окт 2009, 19:59

А в смотрели эту страничку в wiki?
Аватара пользователя
insaner
 
Сообщения: 13
Зарегистрирован: 23 июн 2009, 19:39

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение michail1982 » 24 дек 2009, 15:00

подправил в wiki.. чтоб не вызывать 2й раз get_instance
Аватара пользователя
michail1982
 
Сообщения: 612
Зарегистрирован: 25 ноя 2008, 15:36

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение michail1982 » 25 дек 2009, 12:05

ещё 1 момент...
Код: Выделить всё
// Does the User Agent Match?
        if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50)))
 

в этой строчке тоже сессия теряеться
добавил в проверку на загрузчик переменную $is_flash и заменил на
Код: Выделить всё
// Does the User Agent Match?
        if ($this->sess_match_useragent == TRUE AND ( !$is_flash AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50))))
 

и теперь порядок :))
Аватара пользователя
michail1982
 
Сообщения: 612
Зарегистрирован: 25 ноя 2008, 15:36

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение avenus » 16 янв 2010, 05:42

У меня проблема с flash загрузчиком похожая, только не пойму как решить.

В контроллере manage проверяется наличие данных в существующей сессии.
И, получается, что загрузка файлов не срабатывает, сессия теряется.
В uploadify прописан путь 'script':'/manage/filesupload', т.е. вызов метода filesupload.

Но, чтобы запретить вызов метода загрузки файлов без наличия сессии, использую _remap:
Код: Выделить всё
var $root;

function __construct(){
 parent::Controller();
 $this->root=$this->session->userdata('root');
}

function _remap($method){
 if($this->root) $this->$method();
 else redirect('/');
}
 


Если же для метода filesupload убрать проверку на наличие данных в сессии
Код: Выделить всё
switch($method){
 case 
'filesupload';
     
$this->$method();
    break;
 default;
    if(
$this->root$this->$method();
    else 
redirect('/');

То загрузка файлов происходит, но после этого сразу сессия уничтожается.

Подскажите, пожалуйста, как исправить такую проблему?
avenus
 
Сообщения: 11
Зарегистрирован: 09 янв 2010, 23:17

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение avenus » 16 янв 2010, 18:11

То, что написано в wiki не помогает.
Заменил библиотеку Session на Native Session.
Теперь работает как положено :)
avenus
 
Сообщения: 11
Зарегистрирован: 09 янв 2010, 23:17

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение michail1982 » 12 авг 2010, 09:51

обновил страничку в вики... убрал проверку юзерагента и заменил пробелы плюсами
Аватара пользователя
michail1982
 
Сообщения: 612
Зарегистрирован: 25 ноя 2008, 15:36

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение michail1982 » 27 окт 2010, 21:30

опять обновил =)
теперь сессии не пропадают при незашифрованных куках
Аватара пользователя
michail1982
 
Сообщения: 612
Зарегистрирован: 25 ноя 2008, 15:36

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение Stalkerok » 31 окт 2010, 22:58

Код: Выделить всё
'scriptData'   : {'<?=$sess_cookie_name?>' : '<?=$sess_cookie?>'}


а как должен выглядеть контроллер?

потому что у меня ошибка
Message: Undefined variable: sess_cookie
Stalkerok
 
Сообщения: 224
Зарегистрирован: 11 сен 2008, 08:34

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение michail1982 » 01 ноя 2010, 08:37

Аватара пользователя
michail1982
 
Сообщения: 612
Зарегистрирован: 25 ноя 2008, 15:36

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение freebit » 20 ноя 2010, 11:45

Нет, ну серьезно! Установил MY_Session.php c wiki .Устанавливаю в настройках SWFUpload
Код: Выделить всё
post_params: {'<?=$sess_cookie_name; ?>' : '<?=$sess_cookie; ?>'}


Вылетает ошибка, мол не определены такие переменные. Хорошо! Имя cookie я взял из $this->session->sess_cookie_name, а значение сессии не пойму где взять. Подскажите, пожалуйста.
freebit
 
Сообщения: 2
Зарегистрирован: 20 ноя 2010, 11:13

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение michail1982 » 20 ноя 2010, 14:12

Код: Выделить всё
'scriptData'   : {'${sess_cookie_name}' : $.cookie('${sess_cookie_name}')} 

$.cookie - это плагин к jQuery. тоесть значение подставляет клиент
Аватара пользователя
michail1982
 
Сообщения: 612
Зарегистрирован: 25 ноя 2008, 15:36

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение freebit » 20 ноя 2010, 22:33

Спасибо за подсказку! Плагин работает отлично, куки вытягивает, но сессия все равно вылетает. Почему же, даже после передачи сессии в POST`е, она не восстанавливается на сервере? SWFupload продолжает пудрить мне мозг, передавая свой левый id.
freebit
 
Сообщения: 2
Зарегистрирован: 20 ноя 2010, 11:13

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение alt3rmann » 11 апр 2011, 15:21

Два дня упорства не прошли зря! =)

Пытался прикрутить SWFUpload.
Как только я не пробовал изголяться, результат был один - куки передаются, а сессии не работают. И вот меня осенило: куки в пост запросе передаются как-то коряво... и я вспомнил про urldecode().

И... о чудо! Сессии заработали.

В итоге имеем:
1) делаем все как в вики Способ 2;

2) в MY_Session вместо строчки:
Код: Выделить всё
$session = $this->CI->input->post($this->sess_cookie_name); 

пишем:
Код: Выделить всё
$session = urldecode($this->CI->input->post($this->sess_cookie_name)); 


3) юзаем не jquery.cookie, а swfupload.cookies (куки передаются сами и не нужно их дополнительно постом отправлять);
alt3rmann
 
Сообщения: 1
Зарегистрирован: 11 апр 2011, 15:11

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение Stalkerok » 23 янв 2012, 22:00

Скачал jquery-cookie
https://github.com/carhartl/jquery-cookie

Сделал как во втором способе:
http://code-igniter.ru/wiki/%D0%9F%D0%BE%D0%B4%D0%BC%D0%B5%D0%BD%D0%B0_%D1%81%D0%B5%D1%81%D1%81%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_Flash-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA%D0%BE%D0%B2

Подключаю jquey, cookie, и т.д.

В отображении:
Код: Выделить всё
        $("#upload").uploadify({
            'uploader'       : '/resources/libraries/uploadify/uploadify.swf',
            'script'         : '/admin/upload',
            'cancelImg'      : '/resources/libraries/uploadify/cancel.png',
            'queueID'        : 'fileQueue',
            'auto'           : true,
            'multi'          : false,
            'hideButton'     : true,
            'fileExt'        : '*.jpg;*.png;*.jpeg',
            'fileDesc'       : 'Image Files',
            'sizeLimit'      : '1048576',            
            'method'         : 'POST',
            'scriptData'     : {'<?= $sess_cookie_name ?>' : $.cookie('<?= $sess_cookie_name ?>')},
            'buttonImg'      : '/resources/admin/images/search.gif',            
            'onComplete'     : function (event, queueID, fileObj, response, data) {

            }
        });



В контроллере:

Код: Выделить всё
    
....
function 
__construct()
    {
        
parent::__construct();
        
$this->load->library('ion_auth');
        
$this->load->library('session');
        
$this->load->library('form_validation');        
        if (!
$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) redirect('auth');
    }

    public function 
index() {
....
        
$data['sess_cookie_name'] = $this->session->sess_cookie_name;
        
$this -> load -> view('edit'$data);

    }

    function 
upload() {
.... 



Но всё равно файлы не загружаются, а если убрать
Код: Выделить всё
if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) redirect('auth'); 

то всё происходит без ошибок.

Как исправить загрузку?
Stalkerok
 
Сообщения: 224
Зарегистрирован: 11 сен 2008, 08:34

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение Артем » 23 янв 2012, 22:55

Этот загрузчик позволяет передавать параметры? Можно передать идентификатор сессии, поймать его в контроллере и восстановить сессию по нему. Как бы просто. Так часто делают для флешек.
Руководство CodeIgniter 2.1.0

Разработка веб-приложений на заказ, от 50 тыс. рублей Кастомсофт
Артем
Администратор
 
Сообщения: 1808
Зарегистрирован: 06 мар 2010, 15:58

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение Stalkerok » 23 янв 2012, 23:17

customsoft.ru писал(а):Этот загрузчик позволяет передавать параметры? Можно передать идентификатор сессии, поймать его в контроллере и восстановить сессию по нему. Как бы просто. Так часто делают для флешек.


Я так и сделал,scriptData передаёт, а дальше я создал MY_Session.php по WiKi, я так понял как раз восстановление?
Stalkerok
 
Сообщения: 224
Зарегистрирован: 11 сен 2008, 08:34

Re: uploadfiy (swfupload) + CI sessions DB + session_data

Сообщение Артем » 24 янв 2012, 00:47

Имею в виду не жонглирование куками, а использование родных сессий PHP. Буквально две строчки получается - на фронте передать SESSION_ID гетом или постом, а на бэке поймать идентификатор сессии и стартануть ее.
Руководство CodeIgniter 2.1.0

Разработка веб-приложений на заказ, от 50 тыс. рублей Кастомсофт
Артем
Администратор
 
Сообщения: 1808
Зарегистрирован: 06 мар 2010, 15:58

След.

Вернуться в Общие вопросы по фреймворку

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1