2013-10-25 43 views
1

我有一个简单的表与下载文件链接..从Servlet下载文件 - Chrome警告+下载后如何重定向用户?

一切似乎工作正常,当我点击下载,文件被发现在硬盘上,并提供给用户。

我的问题是,当我检查铬我看到:

Resource interpreted as Document but transferred with MIME type application/octet-stream: "http://localhost:8080/fus-app/myUploadedFiles". 

它为什么会这么说?

相关的代码我已经是:

httpServletResponse.setContentType("application/octet-stream"); 
    httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"" + fileNameOnSystem + "\""); 

而且奖金的问题:

文件下载后,用户仍然可以看到该页面的表格,但我想重定向到一个不同的页面。我怎样才能做到这一点?

response.sendRiderect() 

似乎不起作用。

编辑:这是我提供的下载链接到用户:

<form method="post" action="<%= request.getServletContext().getContextPath() +"/myUploadedFiles" %>"> 
    <input type="hidden" name="fileNameOnSystem" value="<%= rset.getString("fileNameOnSystem") %>" /> 
    <button type="submit" class="btn btn-default" />Download File </button> 
</form> 

回答

2

尝试指定在你的下载链接的HTML5下载属性:

<a href='http://example.com/archive.zip' download>Export</a> 

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

对于重定向,这里不是好消息Is it possible to forward or redirect from a servlet filter after the response has been committed? ...

HttpServletResponse的“已提交”状态确实是 表示响应标头是否已写入底层套接字 的一种方式。一个“承诺”的回应已经(至少)写了第一个 行。由于响应的第一行包含代码 ,因此您无法更改已提交的 响应的状态代码...并且这意味着将状态更改为3xx 以执行重定向已为时过晚。同样,你不能做一个本地转发,因为你已经开始发送响应 。

因此,在发送文件(这是一个已完成的响应)之后,您将无法对响应做更多的事情。但是,您可以先将它们转发到另一个页面上,然后显示一条消息并最终触发下载。

找到这个例子:

<html> 
<head> 
<meta http-equiv="refresh" content="5;url=http://server.com/file.zip"> 
</head> 
<body> 
Thank you for downloading file.zip! 
</body> 
</html> 
+0

谢谢您的回答,我已经编辑我的问题。实际上该文件位于驱动器的某个位置,所以我必须提供来自servlet的文件,我不能直接链接到该文件。 –

+0

系统上的文件名称类似于:test1234.pdf,并且我知道它位于哪个目录(如C:\ appuser \ test1234.pdf),因此我可以提供该文件。所以我只能提供某种参数给servlet,然后我放弃文件。 –

+0

您应该只能提供该servlet处理的URL。客户端不知道它是否是实际的文件,或者您只是生成随机位。因此,如果您的servlet处理woogie.com/somefile,则仍然可以在您的网页上放置:'Export'。 – sdanzig