Ошибка загрузки epub в браузере Android / WebKit и общая странность браузера - PullRequest
0 голосов
/ 28 декабря 2010

Я пытаюсь настроить сервлет так, чтобы пользователи мобильных телефонов / планшетов Android (используя браузер по умолчанию) могли заполнить форму и опубликовать несколько параметров в сервлете, а затем сервлет применяет некоторую логику для выбора предварительносуществующий файл epub для потоковой передачи в ответ.Кажется достаточно простым, но он дает мне все виды подгонок.

Настройка: пользователь Android заходит на мой сайт и отправляет форму, сервлет в Weblogic 10.3 выбирает мой один тестовый файл epub для отправки обратно в ответ,устанавливает Content-Type application/epub+zip, устанавливает Content-Disposition attachment; filename=TestPartsManual.epub, передает байты обратно на устройство.

Он отлично работает в Chrome, где я занимаюсь первичной разработкой из-за теоретического сходства WebKit и его крутых инструментов для разработчиков.

Но когда я пробую что-то на своем телефоне Android ( Tmobile Vibrant Galaxy S ), используя браузер по умолчанию ( User-Agent: Mozilla / 5.0 (Linux; U; Android 2.1-update1; ru-ru; SGH-T959 Build / ECLAIR) AppleWebKit / 530.17 (KHTML, как Gecko) Версия / 4.0 Mobile Safari / 530.17 ) с установленным (и работающим) Aldiko, всегда отказывает, в ответе нет содержимогоWeblogic сообщает об ошибке записи в сокет.Поэтому я включил Wireshark и увидел, что происходит несколько странных вещей:

  1. Как только форма помещена в '/ demoapp / partsmanual', трубка немедленно закрывает соединение.Weblogic сообщает об ошибке записи в сокет.
  2. Экран браузера переходит к списку загрузки и сообщает, что пытается загрузить файл "partsmanual.bin"
  3. . Телефон отправляет новый запрос в GET./ demoapp / partsmanual ', но без каких-либо параметров формы сервлет не знает, какой файл отправить обратно, и ничего не отправляется обратно.

Итак, любая идея, почему это внезапноне любит форму POST и в одностороннем порядке решает, что GET без параметров для одного и того же URI будет достаточно ???

Поэтому я упрощаю тестирование и просто предоставляю ссылку на TestPartsManual.epub и настраиваюmime-mapping в web.xml дает расширению epub тип mime application/epub+zip.Я нажимаю на ссылку, проверяю через Wireshark, что Content-Type отправляется, и все выглядит так: выглядит ok:

  1. Экран браузера переходит к списку загрузок, он говоритон загружает TestPartsManual.epub.Это хорошо.
  2. Загрузка завершена, говорится, что она загрузила 216 КБ, Wireshark согласен, и, должно быть, ей понравился Content-Type, потому что значок Aldiko находится слева.Это тоже хорошо.
  3. Но затем, когда вы нажимаете на нее, появляется сообщение «Ваша книга будет загружена».А?Моя книга уже загружена, верно?
  4. Состояние загрузки в строке состояния немедленно сообщает, что загрузка не удалась.Он никогда не отправлял другой GET на сервер.

Итак, есть идеи, почему он игнорирует то, что уже было загружено, а затем сообщает об ошибке загрузки без повторной попытки ??? Сам файл epub, кстати, был проверен, скопирован на мой sdкарта, импортированная в Aldiko, и она читает его очень хорошо, поэтому я не подозреваю сам файл.

** Обновление ** Я считаю, что проблема, которую я вижу, просто нажав на ссылку epubможет быть записан на списки любых привередливых ридеров Android epub, которые вы установили.Хотя Google Books 1.0.16, например, показывает epubs, он не хочет иметь ничего общего с тем, что вы скачиваете, кроме как через их сервис.Aldiko 1.2.14 регистрирует свое намерение обращаться с типом epub mime, но затем разрушает все, что запускается из загрузок браузера.FBReaderJ, кажется, зарегистрировал свое намерение обрабатывать ссылки, оканчивающиеся на .epub, и он обрабатывает загрузку и показывает их (ура FBReaderJ!), Но я пока не могу сказать, будет ли он обрабатывать форму POST исключительно mime-typeмое первоначальное требование), так как я все больше убеждаюсь, что мой первый вопрос выше - проблема с браузером.Я смотрю на вас, Content-Disposition, даже с цитируемыми именами файлов ...

Наконец, (я признаю, это просто касательная), я включаю отладку в Eclipse, подключенной к моей Weblogic VM, чтобы перехватить сообщение формы.Может быть, я вижу что-то проходящее через это.Примерно через 5 секунд браузер мобильного телефона теряет терпение и повторно отправляет форму! В сервлет поступает другой запрос, и он перехватывается другим потоком в сети.Какого черта такое поведение ???Радует, что не пишу приложение для торговли акциями ....

1 Ответ

0 голосов
/ 31 декабря 2010

Вы не можете сейчас сделать это.Как описано выше, в браузере Android при отправке формы, которая отвечает загрузкой файла вложения, ответ сервера останавливается, запускается менеджер загрузок, который неправильно пытается выполнить GET для того же URI, но без параметров формы.Необъяснимо, что этот двойной запрос «задуман», и поддержка форм POST является улучшением, но «не задерживайте дыхание».См. http://code.google.com/p/android/issues/detail?id=1780 и 3949.

Пока это не исправлено, я думаю, вам просто нужно получить файлы .epub с помощью программы чтения, которая зарегистрирована для обработки расширения .epub.

...