如何在没有控制器bean的情况下使用h:outputLink下载文件

时间:2015-09-23 17:07:14

标签: csv jsf download

我需要下载CSV文件,但我不想使用bean。有可能吗?

<h:outputLink id="download" value="#{request.contextPath}/resources/file/download.csv">
    <h:outputText value="download" />
</h:outputLink>

在Firefox中运行良好,在chrome和IE中显示纯文本,我需要一个窗口下载对话框。

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

这取决于浏览器配置,其中包含csv扩展名和HTTP响应上的Content-Type标头的文件。这通常默认为text/csv(您可以在浏览器的HTTP流量监视器中找到它,您可以通过在浏览器中按F12并打开&#34; Network&#34;选项卡)来获取它。默认情况下,大多数浏览器会内联显示text/*内容。但是,最终用户可以操作默认的浏览器行为,通常是在浏览器询问如何处理文件时第一次下载时,然后记住将来的操作。这超出了服务器(您)的控制范围。

您可以在webapp&#39; s Content-Type中使用csv扩展<mime-mapping>扩展名为web.xml的文件标题的默认值,如下所示:

<mime-mapping>
    <extension>csv</extension>
    <mime-type>application/csv</mime-type>
</mime-mapping>

大多数浏览器会将application/*内容与附件相关联,或者已将相关的默认应用关联起来,例如Excel,或将询问最终用户如何处理它。结果也超出了服务器的控制范围。

您可以通过download元素的新HTML5 <a>属性强制另存为对话框,其中您(重新)指定唯一的文件名,如下所示:

<a href="#{request.contextPath}/resources/file/download.csv"
   download="download.csv">download</a>

请注意,您可以在JSF中完美地嵌入纯HTML,并且在静态文本的所有位置上也不需要<h:outputText>。另请参阅Is it suggested to use h:outputText for everything?

或者,如果您已经使用支持passthrough attributes的JSF 2.2,并且您坚持使用<h:outputLink>来完成不支持download的工作属性,然后你可以这样做:

<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:outputLink value="#{request.contextPath}/resources/file/download.csv" 
              a:download="download.csv">download</h:outputLink>

另见Custom HTML tag attributes are not rendered by JSF