Отображение больших текстовых файлов через Ajax / dojo - PullRequest
5 голосов
/ 13 января 2010

Я хочу отобразить пользователю большой текстовый файл (в частности, файлы журнала размером 100 МБ) через веб-интерфейс, не требуя от пользователя загрузки всего файла. Очевидно, что возвращать весь файл в чей-либо веб-браузер было бы неразумно, поэтому моя теория заключалась в том, чтобы использовать Ajax для выборки частей файла в зависимости от того, как пользователь прокручивает файл, подобно тому, как Google Maps предоставляет «окно» карты. .

Мой сервер приложений - это PHP, и я уверен, что могу выполнить соответствующий поиск и чтение файла и вернуть результаты через XHR приложению, но моя среда Ajax - это dojo, и я не могу придумать ни одного стандартного dijit, который будет работать, и я пытаюсь выяснить, как лучше было бы что-то сделать.

Должен ли я получить свой собственный виджет? Есть ли что-то, чего я не знаю? Если я создам свой собственный виджет, какую структуру он должен принять, и есть ли хорошие ресурсы для разработки пользовательских виджетов для dojo / dijit? Есть еще мысли?

Ответы [ 4 ]

1 голос
/ 05 февраля 2010

Рассматривали ли вы использовать Dojo Grid для просмотра журналов? Он имеет встроенную поддержку динамической загрузки «страниц», то есть строк данных.

1 голос
/ 14 января 2010

Это похоже на то, что вам может понадобиться Я бы посоветовал вам использовать li, потому что вы в конечном итоге захотите выполнить некоторые действия в каждой строке, скорее всего, каждая строка будет релевантной .

Прокрутка - это хорошо, но вы также можете просто перетащить интерфейс с нумерацией страниц, то есть они нажимают на следующую страницу, предыдущую страницу, и вы выбираете ее, а затем обновляете представление. Это самый простой способ. С помощью прокрутки вам понадобится больше и больше текущих видимых линий для плавной прокрутки.

Например, если вы хотите отобразить 25 строк, вам нужно выбрать 25 + нижнюю панель с первого хода и определить линии, отображаемые на нижней панели, в качестве порога для оповещения о новом событии, чтобы загрузить дополнительные 25 + нижняя накладка предметов.

С файлом в 100 Мб, это скоро станет медленным, поэтому вам придется очистить предыдущие записи и определить новый верхний блок, чтобы подать запрос на получение обратного. То есть 1-й запрос: выбор 25 + нижняя панель, 2-й запрос выборка 25 + нижняя панель удаления предыдущая 25 - верхняя панель.

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

Никто не собирается жаловаться на то, что им нужно нажимать следующую страницу / предыдущую страницу, это будет быстро и чисто, но испортит прокрутку, и никто не захочет использовать ваш виджет.

Вот еще несколько ресурсов по этой теме: Старая таблица прокрутки Ajax - Твиттер как load more tut - Хороший пример прокрутки, прочитайте источник - Проверьте этот проект GoogleCode

1 голос
/ 14 января 2010

Рекомендую кеширование.

Следует отметить, что решение этой проблемы должно учитывать, что чтение достаточно большого файла (100 МБ +) с диска будет привязано к диску и может превысить любой тайм-аут, установленный вашим веб-сервером для времени выполнения скрипта. , Чтобы не заставлять пользователя ждать непомерно много времени для загрузки какой-либо части файла, я бы избегал таких хаков, как изменение ограничений времени ожидания вашего сервера.

Вот одно из возможных решений, которое приходит на ум: 1) Кэшируйте файл, разбивая его на отдельные файлы. Вы можете легко сделать это в работе cron или даже запустить ее, когда файл записан. Используйте readfile_chunked (http://cn2.php.net/manual/en/function.readfile.php#48683) или аналогичный.

2) Напишите скрипт обработчика службы, который при вызове из браузера (скажем, «./readfile?chunk=##») возвращает запрошенный фрагмент.

3) Используйте виджет нумерации страниц или скроллер, как было предложено другим участником, для вызова обработчика сервиса через AJAX.

Минусы: это неизбежно увеличит объем дискового пространства. Плюсы: счастливые пользователи, так как доступ к диску будет оптимизирован, так же как и время выполнения скрипта. Кроме того, это хорошо масштабируется. (порядка O (n)).

0 голосов
/ 14 января 2010

Если файл журнала представляет собой текстовый файл с последовательным окончанием строки, возможно, вы можете извлечь его по номеру строки.

У меня есть идея с алгоритмом, подобным этому:

  1. Когда страница загружена, извлеките первые 100 строк из файла. поместите его в какой-нибудь контейнер, возможно, div, textarea или используя <ul><li>
  2. Поместите обработчик событий, чтобы он знал, что у пользователя есть прокрутка до последней части контейнера.
  3. Отправьте запрос AJAX, чтобы получить следующие 100 строк из файла. Передайте смещение строки в качестве параметра (GET или URI Parameter), чтобы скрипт PHP мог получить нужную часть файла
  4. Поместите ответ AJAX в конец контейнера, обновите смещение следующего запроса AJAX.
  5. Если в файле больше не осталось строк, вернуть пустой ответ. Обработчик AJAX должен рассматривать это как конец файла, поэтому он удалит обработчик событий на шаге 2 выше.

Я не знаю много о Додзё. Я использую прокрутку jquery tools в своем приложении. Легко поместить обработчик событий, когда скроллер достигнет последней страницы, а затем получить следующий элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...