Почему некоторые данные POST теряются при использовании Uploadify? - PullRequest
5 голосов
/ 20 апреля 2010

Последние пару месяцев я использовал Uploadify в своем PHP-приложении и пытался отследить неуловимую ошибку. Я получаю электронные письма, когда происходят фатальные ошибки, и они предоставляют мне большое количество деталей. Я получил десятки из них. Однако я не смог воспроизвести проблему сам. Некоторые пользователи (как и я) не испытывают никаких проблем, в то время как другие испытывают.

Прежде чем я подробно расскажу о проблеме, рассмотрим поток.

  • Пользователь посещает экран редактирования страницы в CMS, которую я использую.
  • Идентификатор записи для страницы помещается в форму как скрытое значение.
  • Пользователь нажимает кнопку обзора Uploadify и выбирает файл (разрешен только один выбор файла).
  • Пользователь нажимает кнопку Отправить для моей формы.
  • jQuery перехватывает действие отправки формы, запускает Uploadify, чтобы начать загрузку, и возвращает false для действия отправки (вручную отменяя событие отправки формы, чтобы Uploadify мог вступить во владение).
  • Uploadify загружает в пользовательский скрипт процесса.
  • Uploadify завершает загрузку и запускает обратный вызов завершения Javascript.
  • Обратный вызов Javascript вызывает $ ('# myForm'). Submit () для отправки формы.

Теперь это то, что ДОЛЖНО произойти. Я получил отчеты о зависании загрузки на 100%, а также другие, где отображается «Ошибка ввода-вывода».

Что происходит, форма отправляется с обратным вызовом завершения, но некоторые параметры сообщения, присутствующие в форме, просто отсутствуют в данных сообщения. Идентификатор страницы, который, как я говорил ранее, добавляется в форму как скрытое поле, просто отсутствует в данных поста ($ _POST) - в массиве $ _POST нет элемента для 'id'. Странно то, что данные поста содержат значения для некоторых полей. Например, у меня есть ввод типа text с именем «name» для имени записи, и он отображается в данных поста.

Вот что я собрал:

  • Это происходило в Mac OSX 10.5 и 10.6, Windows XP и Windows 7. Я могу опубликовать точные строки пользовательских агентов, если это поможет.
  • Пользователи должны использовать Flash 10.0.12 или более поздней версии. Мы сделали так, чтобы форма возвращалась к использованию обычного поля «файл», если они имеют <10.0.12. </li>

У кого-нибудь есть ЛЮБЫЕ идеи вообще, что может быть причиной этого?

Ответы [ 3 ]

3 голосов
/ 26 апреля 2010
IOError: Client read error (Timeout?)

Я часто получаю ту же ошибку, хотя на моей стороне сервера python / django. Я предположил, что время ожидания клиента истекло, но, оглядываясь назад, я вижу, что в журналах для вас совпадение прекращения, когда я что-то изменил в процедурах аутентификации. Возможно ли, что сервер получает файл, но затем отказывается записывать его в хранилище?

Кроме того, вы знаете, что несколько флеш-клиентов не отправляют куки? Вы должны обойти это, вставив ключи сеанса в переменную uploadify 'scriptData'.

х --------------------------------

Edit. Этот код на python / django начинается с подпрограммы, которой отправляет себя uploadify:

# Adobe Flash doesn't always send the cookies, esp. from Apple Mac's.
# So we've told flash to send the session keys via POST. So recreate the
# session now. Also facilitates testing via curl.
cookie_name = settings.SESSION_COOKIE_NAME
if request.member.is_anonymous() and request.POST.has_key(cookie_name):

        # Convert posted session keys into a session and fetch session
        request.COOKIES[cookie_name] = request.POST[cookie_name]
        SessionMiddleware().process_request(request)

# boot anyone who is still anonymous
if request.member.is_anonymous():
    response['message'] = "Your session is invalid. Please login."
    return HttpResponse(simplejson.dumps(response), mimetype='application/json')
0 голосов
/ 26 апреля 2010

Вы пытались использовать Live HTTP Headers в Firefox, чтобы увидеть, происходит ли какое-то переписывание, которое приводит к потере данных поста?

0 голосов
/ 26 апреля 2010

Uploadify может изменить форму. Посмотрите на дерево html / DOM формы в тот момент, когда загрузка завершена и она вызывает ваш обратный вызов.

...