Java 我应该如何提供压缩网页?

Java 我应该如何提供压缩网页?,java,tomcat,zip,webpage,multipart,Java,Tomcat,Zip,Webpage,Multipart,背景: 我们的软件以常见的可疑格式(HTML、PDF等)为客户生成报告,每个报告可以包含该报告特有的图表和其他图形。对于PDF,所有东西都保存在一个地方—PDF文件本身。HTML比较复杂,因为报告基本上是多个文件的总和。这些文件可以通过Tomcat通过HTTP访问 问题: 我真的希望有一个整洁的环境,并将HTML报告打包成一个文件。有MTHML,数据URI,需要考虑的几种格式。假定,由于缺乏对这些格式的跨broser支持,ZIP是一个整洁的解决方案。这对我很有吸引力,因为我也可以提供zip作为“

背景:
我们的软件以常见的可疑格式(HTML、PDF等)为客户生成报告,每个报告可以包含该报告特有的图表和其他图形。对于PDF,所有东西都保存在一个地方—PDF文件本身。HTML比较复杂,因为报告基本上是多个文件的总和。这些文件可以通过Tomcat通过HTTP访问

问题:
我真的希望有一个整洁的环境,并将HTML报告打包成一个文件。有MTHML,数据URI,需要考虑的几种格式。假定,由于缺乏对这些格式的跨broser支持,ZIP是一个整洁的解决方案。这对我很有吸引力,因为我也可以提供zip作为“HTML报告,你可以通过电子邮件”选项下载。(在过去,用户抱怨在开始通过电子邮件发送HTML报告时丢失了图形)

解决办法似乎很简单。一个请求进来了,我找到了合适的zip文件,将它解压缩到Web服务器上的某个地方,将请求指向新的HTML文件,然后在一天左右的时间里重新整理所有东西

但这似乎有点不对。我有一种直觉,认为这不是一个好的解决方案,它有一些内在的问题,或者可能存在一个更好的方式,我现在看不到

有人能建议这是好是坏,并提供一个替代解决方案吗

编辑以获取更多背景信息

这些报告需要保存在服务器上。我们的客户是站点的用户,单个报告的可视性可能与站点中的每个人一样广泛。创建过程涉及用户选择报表的条件,并将其提交给服务器进行创建。从数据库中提取数据并生成文档。占位符记录进入数据库,文档本身存储在文件服务器的某个位置。我希望“文件服务器上的文档”部分更整洁—压缩也意味着使用更少的磁盘空间!。创建报表后,任何人都可以看到它。

我原以为zip文件最终会出现在客户机上,而不是留在服务器上

在不了解您的体系结构的情况下,我会猜测这样一种方法:

  • 用户请求报告
  • 服务器将报告显示为HTML
  • 用户可能会调整一些参数,重复请求
  • 服务器将报告显示为HTML(重复,直到用户满意为止)
  • 在每个HTML报告上都有一个“下载为zip”链接
  • 用户点击链接
  • 服务器重新生成报告,将其存储在zip文件中,并将其提供给用户
  • 用户将zip文件保存在某个地方,通过电子邮件发送给周围的人,等等-服务器根本不参与
当然,这依赖于能够重新运行报告来生成zip文件。您可以在每次生成一些HTML时生成一个zip文件,但如果您不需要这样做,并且需要清理等,那么这是浪费

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


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

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

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

这很能说明问题——这意味着报告是可共享的,您还希望“缓存”报告,这样就不必重新生成报告

实现这一点的一种方法是找到一种将参数散列在一起的方法,即不同的参数组合(导致不同的报告)散列到不同的值。然后,您可以使用这些散列作为密钥,将其放入存储在磁盘zip中的大型报告缓存中(可能是文件名还是散列?)

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


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

@Jon:你一只手上有多少个手指?这是您第N次以如此快的速度回复(其中N相当多):)报告不是每次提供时都生成的-它们需要无限期地保留在服务器的文件系统上,这需要尽可能整洁和节省空间。我调整了问题,所有这些都完成了,只是HTML报告存储为它们的组成部分,而不是zip。我的问题是做拉链是不是一个好主意。抱歉,如果我没有很好地表达这一点!:)啊,嗯,我想把拉链拉起来没有什么问题。它是v