Работа с SWFUpload и сессиями PHP - PullRequest
3 голосов
/ 08 июля 2011

Я использую аддон jquery swfupload.

Это дополнение SWFUpload работает с php-файлом upload.php (отправляет информацию о загруженном файле на него, а php сохраняет в dir).

Теперь моя проблема в том, что на каждой странице моего сайта я включил page_protect ();

Это запускает проверки сессий и устанавливает переменные сессии, такие как userID.

Сейчас вupload.php Я хочу вывести пример.«OK id 123, вы сделали это !!»

id 123 должен быть выведен в виде $ _SESSION ['userID'].Я попытался вывести это, но ничего подобного в $ _SESSION ['userID'] нет.

Я не понимаю, это работает на всех моих других страницах.

Но похоже, что SWFupload использует флэш-память для чтения и выполнения upload.php, сеанс другой / исчезает и не может получить переменные?

Есть объяснение этому?Как я могу это исправить?

Обновление

Я попытался создать HTML-форму обычного файла с action = "upload.php" и сделал upload.php для отправкиидентификатор сессии().Когда я сделал это, я получил тот же идентификатор, что и другие мои сайты, и моя переменная userID работала просто отлично!

Затем я попытался установить для debug значение true на swfupload и выгрузить файл upload.php таким же образом, session_id, и этораз это был другой session_id и НЕ, как и другие, которые содержат переменную user_ID.

Так или иначе, когда он использует flash и выполняет upload.php, он начинает совершенно новый сеанс и, следовательно, в нем нет переменных, сохраненных в нем.Хотя это только теория, которую я обнаружил до сих пор.

Обновление

Хорошо, так что теперь я обнаружил, что session_id отправляется в конфигурации SWFUpload,

post_params: {"PHPSESSID" : "<?php echo session_id(); ?>"},

И я могу увидеть в файле upload.php позже в коде, после печати session_id (), что он фактически изменяет идентификатор сеанса следующим образом:

// Code for Session Cookie workaround
    if (isset($_POST["PHPSESSID"])) {
        session_id($_POST["PHPSESSID"]);
    } else if (isset($_GET["PHPSESSID"])) {
        session_id($_GET["PHPSESSID"]);
    }

Я взял это ипоместил его до того, как я распечатал session_id (), и теперь он печатает тот же session_id (), что и тот, в котором хранится переменная userID.

Теперь я пытаюсь снова вывести userID, но теперь я просто получаю Undefinedindex: ошибка userID, как будто она не была установлена.

Я также попытался установить другую переменную, кроме userID, 'test' со значением 123, установить на странице загрузки формы и хочу вывести при загрузке.Страница php, и он не может вывести его.

Как я могу это исправить?пожалуйста

Ответы [ 5 ]

3 голосов
/ 08 июля 2011

См. http://www.swfupload.org/forum/generaldiscussion/383 для объяснения проблемы.

По сути SWFUpload не передает ваш файл cookie сессии в ваш скрипт загрузки. Обходной путь - передать идентификатор сеанса в качестве параметра или некоторый идентификатор, который может воссоздать сеанс при вызове сценария загрузки.

1 голос
/ 08 июля 2011

Проблема в том, что Flash Uploader ничего не знает о сеансе пользователя.По умолчанию данные сеанса хранятся в виде куки в браузере пользователя и в виде файла на стороне вашего сервера.Чтобы Flash Uploader позаботился о сеансе, сделайте что-то вроде этого:

{
  movie: 'uploader.swf', 
  id: 'someid',
  name: 'someid',
  flashvars: 'cookie=' + document.cookie,
}

При запуске сеанса на стороне сервера:

$cookies = explode(';', $_POST['cookie']);

// Get your session cookie like
// list($cookieName, $cookieValue) = str_split('=', $_GET['cookie']);

session_name($sessionName);
session_start();

В качестве альтернативы вы всегда можете добавить идентификатор сеанса к действию формы какВы уже сделали.

0 голосов
/ 07 июля 2014

Только не забудьте, что параметры в php.ini, которые устанавливают:

  session cookies to on
  and session.use_only_cookies to off

и в сеансе окружения symfony1.x, обрабатываются следующим образом:

  post_params: {
     <?php echo "'".ini_get('session.name')."':'".session_id()."',"; ?>
  }
0 голосов
/ 27 февраля 2014

Так же, как вы указали, идентификатор сессии передается в конфигурации swfupload с помощью:

// Загрузка конфигурации

var settings = {
        flash_url: "swfupload/swfupload.swf",
        upload_url: "swfupload/upload.php",
        post_params: {
            "PHPSESSID": "xxx",
            "uploadpath": "xxx"
        }

Так что все, что вам нужно сделать, это в вашем PHP:

if (isset($_POST['PHPSESSID'])){
   session_id($_POST['PHPSESSID']);
}

Если сеанс не существует, session_id вернет пустую строку, чтобы вы могли продолжить с нее.

http://nl3.php.net/session_id

0 голосов
/ 08 июля 2011

По умолчанию SWFUpload отправляет файлы один за другим в upload.php, а затем отправляет форму на целевую страницу.Это целевая страница, которую на самом деле видит пользователь, поэтому выведите на экран все, что там, естественно, не будет отображаться в браузере (так как это видит только приложение flash и пересылается в javascript).Если вы явно не скажете javascript показать возвращаемое значение из upload.php, оно не будет видно.

...