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

3

我需要下载一个CSV文件,但我不想使用bean(Java对象)。有可能吗?

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

在Firefox中可以正常工作,但在Chrome和IE中只显示纯文本,我需要一个窗口下载对话框。
谢谢您的时间。
1个回答

4
这取决于浏览器配置,涉及到带有“csv”扩展名的文件和HTTP响应中的“Content-Type”头。通常默认为“text/csv”(您可以在浏览器的HTTP流量监视器中找到它,通过按F12在浏览器中打开“网络”选项卡)。大多数浏览器通常会内联显示“text/*”内容。但最终用户可以操纵默认浏览器行为,通常在下载时第一次浏览器会询问如何处理该文件,然后记住以供将来使用。这超出了服务器(您的)的控制范围。
您可以通过webapp的“web.xml”中的“mime-mapping”来操纵具有“csv”扩展名的文件的“Content-Type”头的默认值,如下所示:
<mime-mapping>
    <extension>csv</extension>
    <mime-type>application/csv</mime-type>
</mime-mapping>

大多数浏览器会将application/*内容视为附件,或已经关联了默认应用程序,例如Excel,或会询问最终用户该怎么做。结果也超出服务器的控制范围。
您可以通过新的HTML5 download属性强制使用“另存为”对话框,该属性位于<a>元素中,其中您可以重新指定唯一的文件名,如下所示:
<a href="#{request.contextPath}/resources/file/download.csv"
   download="download.csv">download</a>

请注意,你可以完美地嵌入纯HTML到JSF中,而且你也不需要在所有静态文本的地方使用<h:outputText>。参见建议什么时候使用h:outputText? 或者,如果你已经使用支持透传属性的JSF 2.2,并且坚持使用不支持download属性的<h:outputLink>,那么你可以按照下面的步骤操作:
<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:outputLink value="#{request.contextPath}/resources/file/download.csv" 
              a:download="download.csv">download</h:outputLink>

请参见JSF无法呈现自定义HTML标记属性.


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