笔者在最近的项目中遇到动态表格中下载文件的问题,以下是测试的小例子,支持下载中文名的文件.
一 页面test.jsp
1![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
2![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
3![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
4![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
5
<html>
6
<head>
7
<title>文件列示</title>
8
</head>
9
<body>
10
<f:view>
11
<h:form>
12
<t:panelGrid>
13![](/Images/OutliningIndicators/None.gif)
14
<t:panelGroup>
15
<!-- this is table -->
16
<t:dataTable id="data" value="#{fileBean.contentList}" var="result" border="1" width="100%" rows="10">
17![](/Images/OutliningIndicators/None.gif)
18
<t:column rendered="true">
19
<f:facet name="header">
20
<t:outputText value="编号" />
21
</f:facet>
22
<t:outputText value="#{result.number}" />
23
</t:column>
24![](/Images/OutliningIndicators/None.gif)
25
<t:column rendered="true">
26
<f:facet name="header">
27
<t:outputText value="名称" />
28
</f:facet>
29
<t:outputText value="#{result.name}" />
30
</t:column>
31![](/Images/OutliningIndicators/None.gif)
32
<t:column rendered="true">
33
<f:facet name="header">
34
<t:outputText value="大小" />
35
</f:facet>
36
<t:outputText value="#{result.size}" />
37
</t:column>
38![](/Images/OutliningIndicators/None.gif)
39
<t:column rendered="true">
40
<f:facet name="header">
41
<t:outputText value="操作" />
42
</f:facet>
43
<t:commandButton value="下載" actionListener="#{fileBean.downloadFile}" />
44
</t:column>
45
</t:dataTable>
46
47
</t:panelGroup>
48
</t:panelGrid>
49
</h:form>
50
</f:view>
51
</body>
52
</html>
二 MyFile.java
1
package com.jakin;
2![](/Images/OutliningIndicators/None.gif)
3![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class MyFile
{
4
private String number;
5
private String name;
6
private String size;
7![](/Images/OutliningIndicators/InBlock.gif)
8![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public MyFile(String number, String name, String size)
{
9
super();
10
this.number = number;
11
this.name = name;
12
this.size = size;
13
}
14![](/Images/OutliningIndicators/InBlock.gif)
15![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getNumber()
{
16
return number;
17
}
18![](/Images/OutliningIndicators/InBlock.gif)
19![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setNumber(String number)
{
20
this.number = number;
21
}
22![](/Images/OutliningIndicators/InBlock.gif)
23![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getName()
{
24
return name;
25
}
26![](/Images/OutliningIndicators/InBlock.gif)
27![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setName(String name)
{
28
this.name = name;
29
}
30![](/Images/OutliningIndicators/InBlock.gif)
31![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getSize()
{
32
return size;
33
}
34![](/Images/OutliningIndicators/InBlock.gif)
35![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setSize(String size)
{
36
this.size = size;
37
}
38
}
39![](/Images/OutliningIndicators/None.gif)
三,JSF中的bean:FileBean
1
package com.jakin;
2![](/Images/OutliningIndicators/None.gif)
3
import java.io.File;
4
import java.io.FileInputStream;
5
import java.io.IOException;
6
import java.util.ArrayList;
7
import java.util.List;
8![](/Images/OutliningIndicators/None.gif)
9
import javax.faces.component.UIColumn;
10
import javax.faces.component.UIComponent;
11
import javax.faces.component.html.HtmlDataTable;
12
import javax.faces.context.FacesContext;
13
import javax.faces.event.ActionEvent;
14
import javax.servlet.ServletOutputStream;
15
import javax.servlet.http.HttpServletResponse;
16![](/Images/OutliningIndicators/None.gif)
17![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class FileBean
{
18
private List<MyFile> contentList; // 存放文件的集合
19![](/Images/OutliningIndicators/InBlock.gif)
20![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public List<MyFile> getContentList()
{
21
contentList = new ArrayList<MyFile>();
22![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int i = 0; i < 5; i++)
{
23
MyFile myFile = new MyFile(i + "", i + ".txt", "100K");
24
contentList.add(myFile);
25
}
26
return contentList;
27
}
28![](/Images/OutliningIndicators/InBlock.gif)
29![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setContentList(List<MyFile> contentList)
{
30
this.contentList = contentList;
31
}
32![](/Images/OutliningIndicators/InBlock.gif)
33![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void downloadFile(ActionEvent e)
{
34
UIComponent component = (UIComponent) e.getSource();
35
UIColumn column = (UIColumn) component.getParent();
36
HtmlDataTable dataTable = (HtmlDataTable) column.getParent();
37
int listIndex = dataTable.getRowIndex();
38
MyFile myFile = (MyFile) contentList.get(listIndex);
39
String name = myFile.getName();
40
// String name = "轻松搞定XML.pdf";
41![](/Images/OutliningIndicators/InBlock.gif)
42![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
43
File file = new File("D:\\project\\UploadFile\\" + name);
44
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
45
.getCurrentInstance().getExternalContext().getResponse();
46
ServletOutputStream servletOutputStream = httpServletResponse
47
.getOutputStream();
48![](/Images/OutliningIndicators/InBlock.gif)
49
name = java.net.URLEncoder.encode(name, "UTF-8");
50
httpServletResponse.setHeader("Content-disposition",
51
"attachment; filename=\"" + name + "\"");
52
httpServletResponse.setContentLength((int) file.length());
53
httpServletResponse
54
.setContentType("application/x-download;charset=UTF-8");
55![](/Images/OutliningIndicators/InBlock.gif)
56
byte[] b = new byte[1024];
57
int i = 0;
58
FileInputStream fis = new java.io.FileInputStream(file);
59![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while ((i = fis.read(b)) > 0)
{
60
servletOutputStream.write(b, 0, i);
61
}
62![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (IOException ioe)
{
63
ioe.printStackTrace();
64
}
65
FacesContext.getCurrentInstance().responseComplete();
66
}
67![](/Images/OutliningIndicators/InBlock.gif)
68
}