Java webapp:添加内容处置标头以强制浏览器"另存为"行为

Syn*_*r0r 7 java jsp web-applications content-disposition

即使它不是HTTP 1.1/RFC2616 webapps的一部分,希望强制在浏览器中下载(而不是显示)资源,也可以Content-Disposition像这样使用标题:

Content-Disposition: attachment; filename=FILENAME
Run Code Online (Sandbox Code Playgroud)

即使很难,它只在RFC2183中定义,而不是 HTTP 1.1的一部分,它可以在大多数Web浏览器中使用.

所以从客户端来看,一切都很好.

但是在服务器端,在我的情况下,我有一个Java webapp,我不知道我应该如何设置该头,特别是在以下情况下...

我将在Amazon S3实例上托管一个文件(称为" bigfile ")(我的S3存储桶可以使用部分地址访问,例如:files.mycompany.com/),这样用户就可以在文件中访问此文件.mycompany.com/bigfile.

现在有没有办法制作一个servlet(或.jsp),以便Content-Disposition在用户想要下载该文件时始终添加标题?

代码会是什么样的,如果有的话会有什么问题?

Poi*_*nty 2

您不会有直接引用该文件的 URL。相反,您将拥有一个指向 servlet 代码(或服务器端框架中某种操作代码)的 URL。反过来,在设置标头后,必须访问文件内容并将它们铲到客户端。(您还需要记住酌情处理缓存控制标头。)

HttpServletResponse 类具有可让您设置所需的所有标头的 API。您必须确保在开始转储文件内容之前设置标头,因为标头实际上必须在发送到浏览器的流中首先出现。

这与您可能有一个可以即时生成下载的 servlet 的情况没有太大区别。

编辑为了后代,我将把这些内容留在这里,但我会注意到,当您存储文件时,有(或可能有)某种方法可以将一些 HTTP 标头移交给 S3,这样 Amazon 就会将这些标头吐出当文件送出时。我不太确定你会如何做到这一点,我也不确定“Content-disposition”是一个可以这样设置的标头,但我会继续寻找。