2011-04-11 69 views
2

在我有我的Web服务器的网络上,有一台机器有很多压缩的pdf文件(使用java.util.zip压缩),我可以通过HTTP访问这些文件。当用户想要下载PDF文件时,我知道如何先在服务器上本地解压缩文件,然后通过servlet将解压缩的pdf发送给用户。是否可以将解压缩后的文件传递给用户,而不必先在本地解压缩文件?通过servlet传递解压缩文件,而不先在服务器上解压缩

Regards

+0

您的意思是指示浏览器在到达时自动解压文件? – aioobe 2011-04-11 12:39:17

+0

无论是这种情况,还是浏览器无法做到这一点,都会以某种方式对其进行解压缩,以便最终用户可以将其解压缩。 – Alex 2011-04-11 19:11:02

回答

1

原则上,如果客户在他的请求中表示他接受gzip压缩数据,则可以以压缩格式发送PDF文件,客户端将对其进行解压缩。但有一个问题:虽然压缩文件的压缩算法和HTTP Content-Encoding: gzip是相同的,但Zip文件格式还有更多的东西(因为它可以包含多个文件和一个目录结构),所以它会是必须先剥离掉这些东西。我不确定这会比在你的servlet中解压缩容易得多,然后让你的Servlet引擎重新进行压缩,但试一试。

1

您可以将响应发送到以压缩格式编码的请求。如果客户端不与头请求

Accept-Encoding: gzip, deflate 

例如你可以为他服务使用gzip压缩的(只要内容是你通过一个头:)

Content-Encoding: gzip 

来源声明如下:Wikipedia: HTTP Compression

+0

因此,如果客户端接受gzip,我可以只提供用java.util.zip压缩的文件吗? gzip和java.util.zip是否使用相同的压缩?另外,我希望用户能够接收扩展名为.pdf的未压缩文件。这是否意味着我必须将文件名从扩展名.zip更改为.pdf,或者客户端是否自动执行此操作? – Alex 2011-04-11 14:07:38

+0

@Alex:gzip,Info Zip,PKZip和java.util.zip使用相同的压缩算法,但gzip和zip是不同的文件格式(因为最后一个可以包含多个文件甚至目录结构)。 java.util.zip。*支持不同的类。 – 2011-04-11 22:02:37

+0

一个简单的方法是将文件保存在服务器上作为“.pdf.gz”,然后您可以简单地对它们进行流式处理。我会提供链接到完整的“.pdf.gz”(然后对它们进行流式处理而不指示内容编码)和“.pdf”(然后指示“内容编码:gzip”)。当然,你也应该提供适当的'Content-Type',这样浏览器就可以在安全框中做一些智能提议。 – 2011-04-11 22:05:44

1

是否可以将解压缩后的文件传递给用户而不必先在本地解压缩文件?

这取决于你对“本地”的确切含义,一般答案是“不”。要提供解压缩的内容,您必须首先解压zip。

如果实际上意味着zip文件位于一些非本地机器上,你现在需要保存和流解压的内容之前,先在本地压缩它,那么答案是“是的”,这是可以在不保存本地文件的情况下进行解压缩和流式处理。只需传递/装饰流而不使用FileInputStream/FileOutputStream