Ошибка 302 swfupload

Поэтому у меня есть этот код JavaScript для загрузки swfuploader на страницу ( http://code.google.com/p/swfupload/)

swfuPubThumbnailUploader = new SWFUpload({
  upload_url : "/upload_thumbnail",
  flash_url : "/Flash/swfupload.swf",
  file_size_limit : 512 + " MB",
  file_post_name: 'files[swf]',
  file_types : '*.jpg;*.jpeg;*.gif;*.png',
  file_types_description: "Image Files",
  file_queue_limit : 1,
  button_placeholder_id: 'swf-trans-file-selector',
  button_text: '',
  button_image_url: '',
  button_width: "85",
  button_height: "25",
  button_cursor : SWFUpload.CURSOR.HAND,
  button_window_mode : SWFUpload.WINDOW_MODE.TRANSPARENT,

  post_params : {
                "sid" : sid
  },

  preserve_relative_urls : true,
  file_queued_handler : fileQueued,
  file_queue_error_handler : fileQueueError,
  file_dialog_complete_handler : fileDialogComplete,
  file_dialog_start_handler : sLibraryFileDialogStart,
  upload_start_handler : sLibraryPubUploadStart,
  upload_progress_handler : sLibraryPubUploadProgress,
  upload_error_handler : sLibraryPubUploadError,
  upload_success_handler : sLibraryPubUploadSuccess,
  upload_complete_handler : sLibraryPubUploadComplete,
  queue_complete_handler : queueComplete, // Queue plugin event

  custom_settings: {
    progressTarget : ("fsPPUploadProgress")
  }
});

но затем всякий раз, когда я загружаю (загружаю изображения, чтобы быть более точным...), используя swfuploader, swfuploader будет жаловаться на ошибку 302, которая предполагает, что URL-адрес перенаправляется... но затем, когда я посетил URL-адрес загрузки /upload_thumbnail, нет перенаправления происходит и URL загрузки загружен нормально... поэтому я проверил Fiddler, чтобы проверить два случая, и вот запросы для каждого случая

Когда я посетил /upload_thumbnail через браузер:

GET /upload_thumbnail HTTP/1.1
Host: my.domain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: __utma=171146939.260757561.1311084520.1336078159.1336400574.117; __utmz=171146939.1311084520.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=104299925.1228643063.1313075490.1335542105.1335567483.41; __utmz=104299925.1333981938.38.25.utmcsr=my.domain.com:8090|utmccn=(referral)|utmcmd=referral|utmcct=/browse/MD-2760; __qca=P0-29539114-1325619242917; SESS5ccc5f20cb72179af2f569e77eaa49da=6vde0rln7q3384k5lcvedsgfh3; SimpleSAMLAuthToken=_c2f653a6e9b18b10439d73849fb1142a7d43851998; __utmc=171146939; has_js=1
If-Modified-Since: Mon, 07 May 2012 19:13:38 +0000
If-None-Match: "1336418018"

Который нормально загружается со статусом 200

Тогда тот от swfuploader

POST /upload_thumbnail HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data; boundary=----------gL6Ef1Ef1KM7Ij5gL6ae0gL6GI3GI3
User-Agent: Shockwave Flash
Host: my.domain.com
Content-Length: 847357
Connection: Keep-Alive
Pragma: no-cache
Cookie: __utma=171146939.1934231828.1323362429.1328283903.1333582993.5; __utmz=171146939.1323362429.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=104299925.1653270920.1323362234.1334760245.1335992862.7; __utmz=104299925.1323362234.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS5ccc5f20cb72179af2f569e77eaa49da=0qjn1gva2rhlcqiqp2g7liumd0; __qca=P0-1855943596-1327334275533

который закончился со статусом 302 и перенаправлением на страницу входа....

Итак, я обнаружил, что виновником является запрос Cookie:.... если я переключу запрос браузера COOKIE на запрос cookie swfuploader, запрос swfuploader будет загружен со статусом 200 должным образом...

Мой первый вопрос..... ПОЧЕМУ? Что не так с запросом Cookie от swfuploader?

И, во-вторых, как это можно перевести в мой код SWFUpload javascript на самом верху, чтобы у действующего swfuploader в браузере был правильно настроен запрос Cookie.

1 ответ

Решение

Механизм обработчика сеанса PHP по умолчанию использует ваш Cookie и ваш User-Agent для сопоставления сеанса с пользователем. Поскольку Flash идентифицирует себя на сервере с пользовательским агентом "ShockWave Flash", который отличается от UA вашего браузера, php назначает новый сеанс для запроса.

Вы можете проверить это, если вы выводите _POST данные, а затем сравнить эти значения с теми, которые вы получите после session_start() или если вы измените свой браузер UA, чтобы он точно совпадал с тем, что было отправлено Flash.

Решение?

Передайте идентификатор сеанса на сервер так, как вы хотите, по умолчанию _POST и инициализируйте сеанс с правильным идентификатором.

SWFUpload предоставляет вам post_params это " определяет пары имя / значение, которые будут опубликованы с каждым загруженным файлом ".

// SWFUpload example - taken from you own config file
post_params : {
    "sid" : sid => THIS WOULD BE YOUR SESSION ID!; you can put <?=session_id()?>
},

А потом на стороне сервера...

// Prior to starting the session as you normally do you'll want to check if 
// you're trying to pass a session id by post, if so, initialize session with it
<?php
if(isset($_POST['sid']))
{
    session_id($_POST["sid"]);
}
session_start();
Другие вопросы по тегам