7

即使它不是 HTTP 1.1/RFC2616 webapps 的一部分,希望在浏览器中强制下载(而不是显示)资源也可以使用如下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在用户想要下载该文件时始终添加标头?

代码会是什么样子?有什么问题(如果有的话)?

4

4 回答 4

4

正如Pointy指出的那样,我得到了这个工作。而不是直接链接到资产 - 在我的例子中是 pdfs - 现在链接到一个名为 download.jsp 的 JSP,它接受并解析 GET 参数,然后将 pdf 作为下载提供。

在这里下载

这是我使用的jsp代码。它在 IE8、Chrome 和 Firefox 中工作:

<%@page session="false"
            contentType="text/html; charset=utf-8"
            import="java.io.IOException,
                    java.io.InputStream,
        java.io.OutputStream,
        javax.servlet.ServletContext,
        javax.servlet.http.HttpServlet,
        javax.servlet.http.HttpServletRequest,
        javax.servlet.http.HttpServletResponse,
        java.io.File,
        java.io.FileInputStream"
 %>
<%  
//Set the headers.
response.setContentType("application/x-download"); 
response.setHeader("Content-Disposition", "attachment; filename=downloaded.pdf");

[pull the file path from the request parameters]   

File file = new File("[pdf path pulled from the requests parameters]");
FileInputStream fileIn = new FileInputStream(file);
ServletOutputStream outstream = response.getOutputStream();

byte[] outputByte = new byte[40096];

while(fileIn.read(outputByte, 0, 40096) != -1)
{
    outstream.write(outputByte, 0, 40096);
}
fileIn.close();
outstream.flush();
outstream.close();

%>
于 2011-10-26T01:01:25.297 回答
2

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

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

这与您可能拥有一个可以即时生成下载的 servlet 的情况并没有太大的不同。

编辑为了后代的缘故,我将把这些东西留在上面,但我会注意到,当你存储文件时,有(或可能有)某种方法可以将一些 HTTP 标头移交给 S3 ,这样亚马逊就会将这些标头吐出当文件送达时。我不确定你会怎么做,我不确定“Content-disposition”是一个你可以这样设置的标题,但我会继续寻找。

于 2010-03-08T23:28:08.507 回答
0

.htaccess使用以下行将文件放在根文件夹中:

Header set Content-Disposition attachment
于 2010-03-08T23:59:49.320 回答
0

我刚刚通过谷歌找到了这个。

我有一个类似的问题,但我仍然想使用一个 Servlet(当我生成内容时)。


但是,在 Servlet 中,您只需要以下行。

response.setHeader("Content-Disposition", "attachment; filename=downloadedData.json");
于 2016-01-08T22:46:26.060 回答