【问题标题】:How should I serve ZIPped webpages?我应该如何提供压缩网页?
【发布时间】:2010-10-10 17:34:03
【问题描述】:

背景:
我们的软件以常见的可疑格式(HTML、PDF 等)为客户生成报告,每个报告都可以包含该报告独有的图表和其他图形。对于 PDF,一切都保存在一个地方 - PDF 文件本身。 HTML 比较棘手,因为报告基本上是超过 1 个文件的总和。这些文件可通过 HTTP 通过 Tomcat 获得。

问题:
我真的很想有一个整洁的环境并将 HTML 报告包装到一个文件中。有 MTHML、数据 URI 和几种需要考虑的格式。 This excellent question 认为,由于缺乏对这些格式的跨浏览器支持,ZIP 是一个很好的解决方案。这对我很有吸引力,因为我还可以将 zip 作为“您可以通过电子邮件发送的 HTML 报告”选项提供下载。 (过去,用户抱怨在他们开始通过电子邮件发送 HTML 报告时丢失了图形)

解决方案似乎很简单。收到一个请求,我找到合适的 zip,在网络服务器的某个位置解压,将请求指向新的 HTML 文件,一天左右后再次整理所有内容。

但是这似乎不太对劲。我有一种直觉,认为这不是一个好的解决方案,它存在根本性的问题,或者可能存在我目前看不到的更好的方法。

谁能建议这是好是坏,并​​提供替代解决方案?

编辑以获取更多背景信息!
报告需要保留在服务器上。我们的客户是站点的用户,单个报告的可见性可能与站点中的每个人一样广泛。创建过程涉及用户选择报告的标准,并将其提交到服务器以进行创建。从数据库中提取数据并构建文档。占位符记录进入数据库,文档本身存储在文件服务器的某个地方。我希望更整洁的是“文件服务器上的文档”部分 - 压缩也意味着使用的磁盘空间更少!。创建报告后,任何可以看到它的人都可以使用它。

【问题讨论】:

    标签: java tomcat zip webpage multipart


    【解决方案1】:

    我原以为计划是 zip 文件最终在 客户端 上,而不是留在服务器上。

    在不了解您的架构的情况下,我猜想这样的方法:

    • 用户请求报告
    • 服务器将报告显示为 HTML
    • 用户可能会调整一些参数,重复请求
    • 服务器将报告显示为 HTML(重复直到用户满意)
    • 在每个 HTML 报告中,都有一个“以 zip 格式下载”链接
    • 用户点击链接
    • 服务器重新生成报告,将其存储在 zip 文件中并提供给用户
    • 用户将 zip 文件保存在某处,通过电子邮件发送等 - 根本不涉及服务器

    当然,这依赖于能够重新运行报告以生成 zip 文件。您可以在每次生成一些 HTML 时生成一个 zip 文件,但如果您不需要 这样做,那就太浪费了,而且需要清理等。

    也许我误解了你……如果这听起来不合适,你能更新你的问题吗?

    编辑:好的,看到您的问题的更新后,我很想将每个报告的文件存储在单独的目录中(例如,使用 GUID 作为目录名称)。许多文件系统支持文件系统级别的压缩,因此“过早压缩”可能不会节省太多磁盘空间,并且会使提取单个文件变得更加困难。然后,如果用户请求 zip,您只需要在那个时候构建 zip 文件,可能只是在内存中,然后再提供它。

    【讨论】:

    • @Jon:你一只手有几根手指?这是你第 N 次打败我,它回复得如此之快(其中 N 相当多):)
    • 报告不是在每次提供服务时都生成的——它们需要无限期地保存在服务器的文件系统上,这需要尽可能整洁和节省空间。我调整了问题。
    【解决方案2】:

    一旦创建报告,它就是 任何人都可以看到它。

    这很能说明问题 - 这意味着报告是可共享的,并且您还希望“缓存”报告以便不必重新生成。

    做到这一点的一种方法是找出一种将参数散列在一起的方法,这样不同的参数组合(导致不同的报告)散列到不同的值。然后,您可以使用这些散列作为键,以 zip 格式存储在磁盘中的大量报告缓存中(可能文件名是散列?)

    这样,每次有人请求报告时,您都会对参数进行哈希处理,并检查该报告是否已经生成,然后以 zip 下载的形式提供该报告,或者您可以将其解压缩并提供 html按照正常情况。如果报告不存在,生成它并压缩它,确保以后能够识别它是由这些参数生成的(即记录散列)。

    需要注意的一点是文件系统写入往往是非原子的,所以如果你不小心,你会重新生成报告两次,这很糟糕,但幸运的是,在你的情况下,不是太 有害的。为避免,您可以使用单个线程来执行此操作(较慢),或实施某种锁。

    【讨论】:

    • 所有这些都完成了,除了 HTML 报告作为其组成部分存储,而不是作为 zip。我的问题是做 zip 的事情是否是个好主意。抱歉,如果我没有正确地表达那一点! :)
    • 啊——好吧,我想把它拉上拉链没有什么问题。这是一个非常个人的问题。但是你提到使用更少的磁盘空间更好 - 如果进行压缩没有不利影响,例如消耗 cpu 功率(因为你有很多?)那么我看不出有什么问题。
    【解决方案3】:

    您不需要在文件系统上物理创建 zip 文件。在内存中创建 zips 并没有错,将其流式传输到浏览器并让 GC 负责释放临时 zip 占用的内存。这当然会带来一些问题,因为每次发出请求时不断地重新创建 zip 可能效率低下。但是根据您的需要等来判断这些事情。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2016-04-22
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多