即使它不是HTTP 1.1 / RFC2616 Webapp的一部分,希望强制在浏览器中 下载 (而不是显示)资源,也可以使用如下Content- Disposition标头:
Content- Disposition
Content-Disposition: attachment; filename=FILENAME
甚至更难理解,它仅在RFC2183中定义,而 不是 HTTP 1.1的一部分,它可以根据需要在大多数Web浏览器中工作。
因此,从客户端来看,一切都足够好。
但是在服务器端,就我而言,我有一个Java webapp,但我不知道如何设置该标头,尤其是在以下情况下…
我将在Amazon S3实例上托管一个文件(例如,称为“ bigfile ”)(我的S3存储桶应使用部分地址来访问,例如: _files.mycompany.com/ ),以便用户可以通过 _files 访问此文件。 _.mycompany.com / bigfile_ 。
现在有没有一种方法可以设计 servlet (或 .jsp ),以便Content-Disposition在用户要下载该文件时始终添加标头?
Content-Disposition
代码将是什么样子,有什么陷阱(如果有)?
您将没有直接引用该文件的URL。取而代之的是,您将拥有一个指向servlet代码(或服务器端框架中的某种操作代码)的URL。反过来,在设置头文件之后,将不得不访问文件内容并将其铲出给客户端。(您还想记住要适当地处理缓存控制标头。)
HttpServletResponse类具有一些API,可让您设置所需的所有标头。 在 开始转储文件内容 之前 ,必须确保已设置标头,因为在发送到浏览器的流中,标头实际上必须排在首位。
这与您可能有一个servlet可以即时 生成 下载的情况没有太大不同。
编辑 为了后代的缘故,我将这些内容保留在此处,但我会注意到,在 存储 文件时,有(或可能)有一些方法可以将一些HTTP标头移交给S3 ,以便Amazon可以将这些标头吐出来文件送达时。我不确定您会怎么做,也不确定“ Content- disposition”是否是可以通过这种方式设置的标头,但我会继续寻找。