我需要下载CSV文件,但我不想使用bean。有可能吗?
<h:outputLink id="download" value="#{request.contextPath}/resources/file/download.csv">
<h:outputText value="download" />
</h:outputLink>
在Firefox中运行良好,在chrome和IE中显示纯文本,我需要一个窗口下载对话框。
感谢您的时间。
答案 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>