代码之家  ›  专栏  ›  技术社区  ›  Kitson

通过Ajax/Dojo显示大文本文件

  •  5
  • Kitson  · 技术社区  · 15 年前

    我想通过Web界面向用户显示一个大文本文件(具体来说是100MB日志文件),而不需要用户下载整个文件。显然,将整个文件返回到某些Web浏览器是不明智的,因此我的理论是使用Ajax根据用户滚动文件来获取部分文件,类似于谷歌地图提供地图“窗口”的方式。

    我的应用服务器是php,我非常确定我可以执行适当的查找和读取文件,并通过xhr将结果返回到应用程序,但是我的Ajax框架是Dojo,我想不出任何标准的dijit可以工作,我正试图找出如何最好地实现某些东西。

    我应该派生自己的小部件吗?有没有我不知道的东西?如果我构建自己的定制小部件,它应该采用什么样的结构,并且有没有为Dojo/Dijit开发定制小部件的好资源?还有其他想法吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   J. Martin    15 年前

    This seems to be a tut on what you might need 我建议您使用LI,因为您最终会希望在每一行上执行一些操作,很可能每一行都是相关的。

    滚动是很好的,但是你也可以通过分页来快速浏览界面,这意味着他们可以点击下一页,上一页,然后提取它,然后更新视图。这是最简单的方法。通过滚动,您需要在当前可见行的上方和下方获得更多信息,以便无缝滚动。

    例如,如果您想显示25行,您需要在第一次执行时获取25+底部填充,并将底部填充中显示的行定义为发送新事件信号以下载额外的25+底部填充项的阈值。

    对于一个100MB的文件,这很快就会变得迟缓,所以您必须清除前面的条目,并定义一个新的顶垫来发出请求以获得反向的信号。也就是说,第一个请求:获取25+底部填充,第二个请求获取25+底部填充,移除前25-顶部填充。

    需要注意的一点是,当你这样做的时候,至少在火狐中,它可能会变得不稳定,并且在加载几次之后不会触发事件,所以你可能想要解除甚至重新绑定你的听众。我之所以这么说,是因为我有一个朋友,他目前正在研究类似功能的东西,而这些都是他遇到的一些问题。

    没有人会抱怨他们必须点击下一页/上一页,这将是快速和干净的,但混乱了你的滚动,没有人会想使用你的小工具。

    以下是有关此主题的其他一些资源: Old Ajax Scrollable Table - Twitter like load more tut - Good scrolling example, read the source - Check out this googlecode project

        2
  •  1
  •   user250120    15 年前

    我推荐缓存。

    应该注意的是,这个问题的解决方案应该考虑到从磁盘读取足够大的文件(100MB以上)将被磁盘绑定,并且可能会超过Web服务器为脚本执行时间设置的任何超时。为了避免让用户等待过多的时间来加载文件的任何部分,我将避免诸如更改服务器超时限制之类的黑客攻击。

    下面是一个可能的解决方案: 1)通过将文件切碎成单独的文件来缓存文件。您可以在cron作业中轻松地执行此操作,甚至在写入文件时触发它。使用readfile_chunked( http://cn2.php.net/manual/en/function.readfile.php#48683 或类似。

    2)编写从浏览器调用时的服务处理程序脚本(比如“./readfile”?chunk=')返回请求的块。

    3)根据其他贡献者的建议,使用分页widgit或滚动条通过Ajax调用服务处理程序。

    缺点:这将不可避免地增加磁盘空间。优点:快乐用户的磁盘访问将得到优化,脚本执行时间也将得到优化。而且,它的伸缩性很好。(按O(N)的顺序)。

        3
  •  1
  •   Yaroslav    15 年前

    您考虑过使用Dojo网格查看日志吗?它内置了对“页面”的动态加载(即数据行)的支持。

        4
  •  0
  •   Donny Kurnia    15 年前

    如果日志文件是一个有一致行尾的文本文件,那么您可以通过行号来获取它。

    我对这种算法有个想法:

    1. 加载页面时,从文件中提取前100行。把它放在某个容器中,可能是一个分区、文本区域或使用 <ul><li>
    2. 放置一个事件处理程序以知道用户已经滚动到容器的最后一部分。
    3. 发送Ajax请求以从文件中获取下100行。将行偏移量作为参数(get或uri参数)传递,以便PHP脚本可以获取文件的正确部分
    4. 将Ajax响应放在容器的末尾,更新下一个Ajax请求偏移量。
    5. 如果文件中没有剩余的行,则返回空响应。Ajax处理程序应该将其视为文件的结尾,因此将在上面的步骤2中删除事件处理程序。

    我对Dojo不太了解。我用 jquery tools's scrollable 在我的申请中。当滚动条到达最后一页,然后提取下一项时,很容易放置事件处理程序。