如何使文件下载而不是在浏览器中打开?

4

我是一个新手,当用户点击下载选项时,我希望文件能够被下载而不是在浏览器中打开。我参考了相关资料,发现大多数建议使用

download

属性来实现此功能。

Response.AddHeader("Content-disposition", "attachment; filename=" + Name);

但我不知道在哪里和如何使用。 实际上,我正在从查询中获取url值,该查询返回存储在arraylist中的bean对象之一作为url(此列表还具有其他值)。 我将url值作为bean放入arraylist中,如下所示:

type=.pdf
release date=12/3/08
name=hai.pdf
url=/files/en/soft/doc/docs/hai.pdf

在我的控制器中,我会像这样获取这个数组列表:
ArrayList details = dao.getdetails(Bean.getNumber());

将其传递给视图,可以像这样:

并将其传递到视图中

Map.put("details", details);
modelView.setViewName("details_list");
modelView.addAllObjects(Map);
return modelView;

在JSP中,我已经迭代了这个ArrayList并显示了如下内容:
Type    name            Release Date            
.txt    hai.pdf     May 21st 2012   Download

.txt    hello.txt   May 21st 2012   Download

在jsp中,我使用以下方式进行下载:
<td colspan="2" valign="top">                           
<a href="${details.Url}"/>
<img src="/images/download.gif" alt="Download" border="0" align="right"></a>
</td>

当我点击下载时,文件会在浏览器中打开。我需要让它直接下载,而不是在浏览器中打开。请帮我解决如何使用或处理该问题。

response.setHeader("Content-Disposition", "attachment;");

请问我应该在哪里添加上述内容以满足我的需求,或者是否可以使用任何JavaScript来完成。请帮我解决以上问题。


@Japs:你能帮我吗? - anto
哦天啊,我已经看到这个问题很多次了。 - Derek 朕會功夫
@Derek:是的,但如何根据我的要求实现呢? - anto
你在用什么编程语言?Java?JavaScript?PHP? - Derek 朕會功夫
@Derek:Java Spring-MVC,我已经做了标记,请参考我的帖子。如果可以使用JavaScript,也请建议我如何实现。 - anto
https://dev59.com/LGw15IYBdhLWcg3wJ4cR - Derek 朕會功夫
3个回答

5
这是一种实现方式:
  1. 创建一个Web过滤器(或这种方式)。
  2. 将此过滤器映射到PDF URL。
  3. doFilter()方法中,设置内容下载的响应头。
示例:
public void doFilter(ServletRequest request, 
   ServletResponse response, FilterChain chain)
   throws IOException, ServletException {

          String name = request.getAttribute("filename");

           response.addHeader("Content-disposition", "attachment; filename=" + name);
           chain.doFilter(request, response);


}

你可以从控制器类中将文件名设置为请求属性(reqest.setAttribute())。
过滤器在Java Web堆栈中相当标准。

最好使用addHeader()而不是addDateHeader()... :-) - yglodt

0

这取决于浏览器在响应中获取的标头。

假设标头是image/png,那么浏览器将显示它。同样,如果您使用application/octet-stream发送相同的图像,则浏览器将强制下载它。

请查看http://en.wikipedia.org/wiki/Byte_stream

在一个项目中,我已经发现从浏览器发送请求是不同的。

如果您从Firefox或IE上传图像,则它们将作为image/png上传,而Chrome将它们作为application/octet-stream上传。


1
请根据我的要求给出建议。 - anto
我不确定你如何在Java中实现它。如果你将响应中的Content-Type更改为application/octet-stream,那么浏览器肯定会强制下载它。看到了吗?我在SO上找到了另一个问题:https://dev59.com/T3VC5IYBdhLWcg3wykQt - ankit
请任何人根据我的需求帮助我。我知道我需要使用 response.setHeader("Content-Disposition", "attachment;filename=blank"); 但是根据我的需求,请任何人阅读我的帖子并帮助我。告诉我我需要在哪里添加以及需要添加什么。 - anto

-1

尝试添加头信息

response.setHeader("Content-Type: application/force-download");


谢谢,但我不知道在哪里添加?如果在控制器中添加,它会显示整个页面作为下载选项,我只想在单击下载时导航到下载。 - anto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接