2010-01-13 3 views
5

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

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

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

ответ

1

This seems to be a tut on what you might need Я бы предположил, что вы используете ли, потому что в конечном итоге вы захотите выполнить некоторые действия в каждой строке, скорее всего, каждая строка будет релевантной.

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

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

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

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

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

Вот некоторые другие ресурсы по теме: Old Ajax Scrollable Table - Twitter like load more tut - Good scrolling example, read the source - Check out this googlecode project

+0

Интересная мысль о пейджинге. Я честно не думал об этом (и я не знаю почему). Спасибо за тут, и приблизительный план того, что нужно сделать, и потенциально возможную альтернативу. – Kitson

+0

Рад помочь, и не волнуйтесь о потрясающих функциях, функциональность - это мой девиз. Удачи с проектом! –

0

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

У меня есть идея с алгоритмом, как это:

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

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

+0

Да, это похоже на то, о чем я думал, но если я буду продолжать загружать и загружать объекты в память обозревателя, я в конце концов взорву его. Я бы подумал, что мне нужно будет беспокоиться о разгрузке объектов. У dojo есть аналогичный объект, называемый 'dojox.layout.ScrollPane'. Я мог бы что-то извлечь из этого. – Kitson

1

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

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

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

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

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

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

+0

Интересно, что, особенно «readfile_chunked», я рассмотрю его. Проблема в том, что в диапазоне 160 000 таких журнальных файлов будет только 10-20 из них могут быть просмотрены, возможно, 5-10 пользователями. У меня уже есть процесс, который индексирует их значимым образом, но я хочу предоставить способ просмотра журналов, не загружая архив локально и находить 20 или 30 строк, которые пользователь ищет. – Kitson

1

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

+0

Я считал это ... Это слишком сложно для того, что мне нужно, и есть некоторые элементы интерфейса, которые не поддаются работе так, как мне нужно, но смешно, что вы должны упомянуть об этом, потому что я решил двигаться вперед с написанием пользовательского Dojo Widget и Datastore, который делает то, что мне нужно, и я обнаружил, что 'dojox.grid._Scroller', который является частью сетки, очень похож на то, что мне нужно, и я беру с собой много подсказок. – Kitson

Смежные вопросы