如何让文件下载而不是在浏览器中打开?
Posted
技术标签:
【中文标题】如何让文件下载而不是在浏览器中打开?【英文标题】:How to make files download instead of opening in browser? 【发布时间】:2012-06-14 00:59:11 【问题描述】:我是个新手,我希望在用户单击下载选项时下载文件
Response.AddHeader("Content-disposition", "attachment; filename=" + Name);
但我不知道在哪里以及如何使用。 实际上,我从编写的查询中获取 url 值,该查询返回 url 作为存储在 arraylist 中的 bean 的对象之一(该列表还有其他值与 url )。 我在arraylist中的url值就像bean一样
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 中,我已经迭代了这个数组列表并像这样显示内容
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" border="0" align="right"></a>
</td>
点击下载它在浏览器中打开。我需要下载它。 请帮助我如何使用或处理
response.setHeader("Content-Disposition", "attachment;");
根据我的要求在哪里添加上述内容,或者我是否也可以使用任何 java 脚本。请帮助我解决上述问题。
【问题讨论】:
@Japs : 你能帮帮我吗 天哪,这个问题我已经看过很多次了。 @Derek:是的,但是如何根据我的要求来实现 你在那里使用什么语言?爪哇? javascript? php? @Derek:java spring-mvc,我已经标记了相同的。请参考我的帖子。如果可以使用javascript也建议我如何实现。 【参考方案1】:这是一种方法:
-
创建一个网络Filter(或this way )
将此过滤器映射到 PDF URL。
在
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() ... :-)【参考方案2】:这取决于浏览器响应的标头。
假设如果标题是 image/png 那么浏览器会显示它。同样的方式,如果您使用 application/octet-stream 发送相同的图像,那么浏览器将强制下载它。
看看http://en.wikipedia.org/wiki/Byte_stream
在一个项目中,我发现从浏览器发送的请求是不同的。
如果您从 Firefox 或 IE 上传图片,那么无论 chrome 将其上传为 application/octet-stream,它都会以 image/png 的形式上传。
【讨论】:
能不能按我的要求给个建议。 我不确定您如何在 Java 中实现它。如果您将响应中的 Content-Type 更改为 application/octet-stream 那么浏览器肯定会强制下载它。看到我在 SO ***.com/questions/186867/… 发现了另一个问题 请任何人根据我的要求帮助我。我知道我需要使用 response.setHeader("Content-Disposition", "attachment;filename=_blank_");但根据我的要求。请任何人都可以阅读我的帖子并提供帮助。请告诉我我需要添加的确切位置以及我需要添加的内容【参考方案3】:尝试添加标题
response.setHeader("Content-Type: application/force-download");
【讨论】:
:谢谢,但我不知道在哪里添加?如果在控制器中添加它,它会将整个页面显示为下载选项,我只想在点击下载时导航到下载以上是关于如何让文件下载而不是在浏览器中打开?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.5 项目下载文件而不是在浏览器中打开它们 PHP 7.1 MAC
如何将 Azure blob 文件下载到下载文件夹中,而不是在浏览器中