2010-01-13 4 views
5

Je souhaite afficher à un utilisateur un fichier texte volumineux (fichiers journaux de 100 Mo spécifiquement) via une interface Web sans que l'utilisateur doive télécharger le fichier entier. Évidemment, renvoyer le fichier entier à un navigateur web de quelqu'un ne serait pas raisonnable, donc ma théorie était d'utiliser Ajax pour récupérer des parties du fichier en fonction du défilement de l'utilisateur, similaire à la façon dont Google Maps fournit une "fenêtre" de la carte . Mon serveur d'application est PHP, et je suis assez sûr que je peux effectuer les recherches et lectures appropriées à travers le fichier et renvoyer les résultats via XHR à l'application, mais mon framework Ajax est dojo et je ne peux pas penser à un dijit standard cela fonctionnerait et j'essaie de comprendre comment ce serait mieux d'implanter quelque chose.Affichage de gros fichiers texte via Ajax/dojo

Dois-je dériver mon propre widget? Est-ce qu'il y a déjà quelque chose que je ne connais pas? Si je construis mon propre widget personnalisé, quel type de structure devrait-il prendre et y a-t-il de bonnes ressources pour développer des widgets personnalisés pour dojo/dijit? D'autres pensées?

Répondre

1

This seems to be a tut on what you might need Je suggère que vous utilisiez un li, parce que vous finirez par vouloir effectuer des actions sur chaque ligne, très probablement chaque ligne sera pertinente.

Le défilement est sympa, mais vous pouvez aussi simplement mélanger l'interface avec la pagination, ce qui signifie qu'ils cliquent sur la page suivante, sur la page précédente et que vous la récupérez, puis mettez à jour la vue. C'est la méthode la plus simple. Avec le défilement, vous aurez besoin d'obtenir plus au-dessus et en dessous des lignes visibles pour le défilement sans faille. Par exemple, si vous voulez afficher 25 lignes, vous devez aller chercher le pavé 25 + en premier, et définir les lignes du pavé inférieur comme seuil pour signaler un nouvel événement pour télécharger un extra. 25+ articles de garniture inférieure. Avec un fichier de 100 Mo, ça va devenir lent, donc vous devrez effacer les entrées précédentes, et définir un nouveau pad supérieur pour signaler une demande pour obtenir l'inverse. C'est-à-dire, 1er req: aller chercher 25 + pad inférieur, 2ème req fetch 25 + pad inférieur enlever prev 25 - pad supérieur. Une chose à noter est, quand vous faites cela, dans firefox au moins, il peut avoir tendance à devenir bancal et ne pas déclencher des événements après quelques charges, donc vous pouvez désamorcer/relier vos auditeurs pairs.Je dis seulement cela parce que j'ai un ami qui travaille actuellement sur quelque chose avec des fonctionnalités similaires, et ce sont quelques-uns des problèmes qu'il a rencontrés. Personne ne va se plaindre qu'ils doivent cliquer sur la page suivante/précédente, ce sera rapide et propre, mais gâcher votre défilement et personne ne voudra utiliser votre widget.

Voici quelques autres ressources sur le sujet: Old Ajax Scrollable Table-Twitter like load more tut - Good scrolling example, read the source-Check out this googlecode project

+0

Une réflexion intéressante sur la pagination. Honnêtement, je n'y avais pas pensé (et je ne sais pas pourquoi). Merci pour le tut, et un aperçu de ce qui devrait être fait et une alternative potentiellement réalisable. – Kitson

+0

Heureux d'aider, et ne vous inquiétez pas pour les fonctionnalités intéressantes, la fonctionnalité est d'abord ma devise. Bonne chance pour votre projet! –

0

Si le fichier journal est un fichier texte avec une fin de ligne cohérente, vous pouvez peut-être l'extraire par numéro de ligne.

J'ai idée avec l'algorithme comme celui-ci:

  1. Lorsque la page chargée, chercher la première ligne 100 de fichier. Placez-le dans un conteneur, peut-être un div, textarea ou en utilisant <ul><li>
  2. Mettez un gestionnaire d'événements pour savoir que l'utilisateur a un défilement vers la dernière partie du conteneur.
  3. Envoie une requête AJAX pour obtenir les 100 prochaines lignes du fichier. Passez le décalage de ligne en paramètre (GET ou URI Parameter) afin que le script PHP puisse obtenir la partie droite du fichier
  4. Mettez la réponse AJAX à la fin du conteneur, mettez à jour le prochain décalage de requête AJAX.
  5. S'il n'y a plus de lignes dans le fichier, retournez une réponse vide. Le gestionnaire AJAX doit considérer cela comme la fin du fichier, donc il supprimera le gestionnaire d'événement à l'étape 2 ci-dessus.

Je ne connais pas grand-chose à Dojo. J'utilise jquery tools's scrollable dans mon application. Il est facile de placer un gestionnaire d'événements lorsque le défilement atteint la dernière page, puis de récupérer l'élément suivant.

+0

Oui, cela ressemble à ce que je pensais, mais si je continue à charger et charger des objets dans la mémoire du navigateur, je finirai par l'exploser. Je pense que je devrais m'inquiéter de décharger les objets. dojo a un objet similaire appelé 'dojox.layout.ScrollPane'. Je pourrais être en mesure d'en tirer quelque chose. – Kitson

1

Je recommande la mise en cache.

La solution à ce problème devrait tenir compte du fait que la lecture d'un fichier suffisamment volumineux (100mb +) sur le disque sera liée au disque et dépassera tout timeout que votre serveur web aura défini pour l'exécution du script temps. Afin d'éviter que l'utilisateur n'attende trop de temps pour charger une partie du fichier, j'éviterais les hacks comme changer les limites de délai de votre serveur.

Voici une solution possible qui vous vient à l'esprit: 1) Cachez le fichier en le découpant dans des fichiers séparés. Vous pouvez facilement le faire dans un travail cron ou même le déclencher lorsque le fichier est écrit. Utilisez readfile_chunked (http://cn2.php.net/manual/en/function.readfile.php#48683) ou similaire.

2) Écris un script de gestionnaire de service qui, lorsqu'il est appelé depuis le navigateur (disons './readfile?chunk=##') renvoie le fragment demandé.

3) Utilisez un widgit de pagination ou un scroller comme suggéré par l'autre contributeur pour passer l'appel au gestionnaire de services via AJAX. Inconvénients: Cela augmentera inévitablement la quantité d'espace disque. Avantages: Les utilisateurs satisfaits en tant qu'accès au disque seront optimisés, de même que le temps d'exécution des scripts. En outre, il évolue bien. (sur l'ordre de O (n)).

+0

Intéressant cependant, particulièrement le "readfile_chunked", je l'examinerai. Le problème est qu'il y aura dans la gamme de 160 000 fichiers de ce genre, dont seulement 10 à 20 pourront être consultés par peut-être 5 à 10 utilisateurs. J'ai déjà un processus qui les indexe d'une manière significative mais je veux fournir un moyen d'afficher les journaux sans avoir besoin de télécharger l'archive localement et de trouver les 20 ou 30 lignes que l'utilisateur recherche. – Kitson

1

Avez-vous envisagé d'utiliser Dojo Grid pour visualiser les bûches? Il prend en charge le chargement dynamique de "pages", c'est-à-dire de lignes de données.

+0

Je l'ai considéré ... C'est un peu trop complexe pour ce dont j'ai besoin et il y a certains éléments de l'interface utilisateur qui ne se prêtent pas à mon travail, mais c'est drôle que vous devriez le mentionner, parce que je J'ai décidé d'écrire un dojo et un datastore personnalisés qui font ce dont j'ai besoin et j'ai découvert que 'dojox.grid._Scroller' qui fait partie de la grille est très similaire à ce dont j'ai besoin et j'en tire beaucoup d'indices. – Kitson

Questions connexes