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

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:是的,但是如何根据我的要求来实现 你在那里使用什么语言?爪哇? javascriptphp? @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");

【讨论】:

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

以上是关于如何让文件下载而不是在浏览器中打开?的主要内容,如果未能解决你的问题,请参考以下文章

如何下载 MP4 文件而不是在浏览器上播放?

如何使Safari和IE下载图像而不是在新页面中打开?

Laravel 5.5 项目下载文件而不是在浏览器中打开它们 PHP 7.1 MAC

如何将 Azure blob 文件下载到下载文件夹中,而不是在浏览器中

.sh 执行询问“你想如何打开这个文件”,而不是在 cmd 中执行

如何使用CakePdf创建和下载PDF,而不是在浏览器中显示它