【Java EE】struts2文件的上传和下载
(一)从底层透析文件上传的实现,此时并没有介入struts21、upload.jsp,在form中属性method默认为get,涉及文件上传时必须改为post,默认 enctype ="application/x-www-form-urlencoded" ,我们暂且不修改,看会有什么结果
1
<%
@ page language="java" contentType="text/html; charset=GBK"
2
pageEncoding="GBK"
%>
3
<!
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
>
4
<
html
>
5
<
head
>
6
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=GB18030"
>
7
<
title
>
Insert title here
</
title
>
8
</
head
>
9
<
body
>
10
<
form
action
="result.jsp"
method
="post"
11
enctype
="application/x-www-form-urlencoded"
>
12
Information:
13
<
input
type
="text"
name
="info"
>
14
<
br
>
15
File:
16
<
input
type
="file"
name
="file"
>
17
<
br
>
18
<
input
type
="submit"
name
="submit"
value
=" submit "
>
19
</
form
>
20
</
body
>
21
</
html
>
result.jsp



2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

1
<%
@ page language="java" contentType="text/html; charset=GBK"
2
pageEncoding="GBK"
%>
3
<!
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
>
4
<
html
>
5
<
head
>
6
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=GB18030"
>
7
<
title
>
Insert title here
</
title
>
8
</
head
>
9
<
body
>
10
Information:
<%
=
request.getParameter(
"
info
"
)
%>
<
br
>
11
File:
<%
=
request.getParameter(
"
file
"
)
%>
<
br
>
12
</
body
>
13
</
html
>
结果:



2

3

4

5

6

7

8

9

10

11

12

13



2、修改result.jsp页面代码,输出读入的流
















这个结果可以断定,文件的上传并没有成功,而仅仅是上传了文件的路径信息而已
3、把upload.jsp中form的enctype属性改为 enctype ="multipart/form-data"










说明文件上传是成功的。
(二)手动采用fileupload组建进行文件上传
upload2.jsp
1
<%
@ page language="java" contentType="text/html; charset=GB18030"
2
pageEncoding="GB18030"
%>
3
<!
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
>
4
<
html
>
5
<
head
>
6
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=GB18030"
>
7
<
title
>
Insert title here
</
title
>
8
</
head
>
9
<
body
>
10
<
form
action
="/MyStruts2/UploadServlet"
method
="post"
enctype
="multipart/form-data"
>
11
username:
12
<
input
type
="text"
name
="username"
>
13
<
br
>
14
password:
15
<
input
type
="password"
name
="password"
>
16
<
br
>
17
file1:
18
<
input
type
="file"
name
="file1"
>
19
<
br
>
20
file2:
21
<
input
type
="file"
name
="file2"
>
22
<
br
>
23
<
input
type
="submit"
value
=" submit "
>
24
</
form
>
25
</
body
>
26
</
html
>
web.xml中的配置



2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26










1
package
com.test.servlet;
2
3
import
java.io.File;
4
import
java.io.FileOutputStream;
5
import
java.io.IOException;
6
import
java.io.InputStream;
7
import
java.io.OutputStream;
8
import
java.util.List;
9
10
import
javax.servlet.ServletException;
11
import
javax.servlet.http.HttpServlet;
12
import
javax.servlet.http.HttpServletRequest;
13
import
javax.servlet.http.HttpServletResponse;
14
15
import
org.apache.commons.fileupload.FileItem;
16
import
org.apache.commons.fileupload.FileUploadException;
17
import
org.apache.commons.fileupload.disk.DiskFileItemFactory;
18
import
org.apache.commons.fileupload.servlet.ServletFileUpload;
19
20
@SuppressWarnings(
"
serial
"
)
21
public
class
UploadServlet
extends
HttpServlet
{
22
@SuppressWarnings(
{ "unchecked", "deprecation" })
23
public void doPost(HttpServletRequest request, HttpServletResponse response)
24
throws ServletException, IOException
{
25
26
DiskFileItemFactory factory = new DiskFileItemFactory();
27
28
String path = request.getRealPath("/upload");
29
30
factory.setRepository(new File(path));
31
32
factory.setSizeThreshold(1024 * 1024);
33
34
ServletFileUpload upload = new ServletFileUpload(factory);
35
36
try
{
37
List<FileItem> list = upload.parseRequest(request);
38
39
for (FileItem item : list)
{
40
if (item.isFormField())
{
41
String name = item.getFieldName();
42
43
String value = item.getString("gbk");
44
45
System.out.println(name);
46
47
request.setAttribute(name, value);
48
} else
{
49
String name = item.getFieldName();
50
51
String value = item.getName();
52
53
int start = value.lastIndexOf("\\");
54
55
String fileName = value.substring(start + 1);
56
57
request.setAttribute(name, fileName);
58
59
item.write(new File(path, fileName));
60
61
OutputStream os = new FileOutputStream(new File(path,
62
fileName));
63
64
InputStream is = item.getInputStream();
65
66
byte[] buffer = new byte[400];
67
68
int length = 0;
69
70
while ((length = is.read(buffer)) > 0)
{
71
os.write(buffer, 0, length);
72
}
73
74
os.close();
75
76
is.close();
77
78
}
79
}
80
}
81
82
catch (Exception ex)
{
83
ex.printStackTrace();
84
}
85
request.getRequestDispatcher("upload/result2.jsp").forward(request,
86
response);
87
}
88
89
}
结果:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21



22



23

24



25

26

27

28

29

30

31

32

33

34

35

36



37

38

39



40



41

42

43

44

45

46

47

48



49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70



71

72

73

74

75

76

77

78

79

80

81

82



83

84

85

86

87

88

89



(三)使用struts2进行文件上传、下载
需引入两个jar包


1、单文件上传
upload3.jsp
1
<%
@ page language="java" contentType="text/html; charset=GB18030"
2
pageEncoding="GB18030"
%>
3
<%
@ taglib prefix="s" uri="/struts-tags"
%>
4
<!
DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
>
5
<
html
>
6
<
head
>
7
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=GB18030"
>
8
<
title
>
Insert title here
</
title
>
9
</
head
>
10
<
body
>
11
<
s:form
action
="upload"
method
="post"
theme
="simple"
12
enctype
="multipart/form-data"
>
13
<
table
align
="center"
width
="50%"
border
="1"
>
14
<
tr
>
15
<
td
>
16
username
17
</
td
>
18
<
td
>
19
<
s:textfield
name
="username"
></
s:textfield
>
20
</
td
>
21
</
tr
>
22
<
tr
>
23
<
td
>
24
password
25
</
td
>
26
<
td
>
27
<
s:password
name
="password"
></
s:password
>
28
</
td
>
29
</
tr
>
30
<
tr
>
31
<
td
>
32
file
33
</
td
>
34
35
<
td
>
36
<
s:file
name
="file"
></
s:file
>
37
38
</
td
>
39
</
tr
>
40
<
tr
>
41
<
td
>
42
<
s:submit
value
=" submit "
></
s:submit
>
43
</
td
>
44
<
td
>
45
<
s:reset
value
=" reset "
></
s:reset
>
46
</
td
>
47
</
tr
>
48
</
table
>
49
</
s:form
>
50
</
body
>
51
</
html
>
web.xml中的配置



2

3



4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51












struts.xml中的配置
1
<?
xml version="1.0" encoding="GBK"
?>
2
<!
DOCTYPE struts PUBLIC
3
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4
"http://struts.apache.org/dtds/struts-2.0.dtd"
>
5
6
<
struts
>
7
<
constant
name
="struts.i18n.encoding"
value
="gbk"
></
constant
>
8
<
constant
name
="struts.multipart.saveDir"
value
="c:\"
></
constant
>
9
<
package
name
="struts2"
extends
="struts-default"
>
10
<
action
name
="upload"
class
="com.test.action.UploadAction"
>
11
<
result
name
="success"
>
/upload/result3.jsp
</
result
>
12
</
action
>
13
</
package
>
14
</
struts
>
UploadAction.java

2

3

4

5

6

7

8

9

10

11

12

13

14

1
package
com.test.action;
2
3
import
java.io.File;
4
import
java.io.FileInputStream;
5
import
java.io.FileOutputStream;
6
import
java.io.InputStream;
7
import
java.io.OutputStream;
8
9
import
org.apache.struts2.ServletActionContext;
10
11
import
com.opensymphony.xwork2.ActionSupport;
12
13
@SuppressWarnings(
"
serial
"
)
14
public
class
UploadAction
extends
ActionSupport
{
15
private String username;
16
private String password;
17
private File file;
18
private String fileFileName;
19
private String fileContentType;
20
21
public String getUsername()
{
22
return username;
23
}
24
25
public void setUsername(String username)
{
26
this.username = username;
27
}
28
29
public String getPassword()
{
30
return password;
31
}
32
33
public void setPassword(String password)
{
34
this.password = password;
35
}
36
37
public File getFile()
{
38
return file;
39
}
40
41
public void setFile(File file)
{
42
this.file = file;
43
}
44
45
public String getFileFileName()
{
46
return fileFileName;
47
}
48
49
public void setFileFileName(String fileFileName)
{
50
this.fileFileName = fileFileName;
51
}
52
53
public String getFileContentType()
{
54
return fileContentType;
55
}
56
57
public void setFileContentType(String fileContentType)
{
58
this.fileContentType = fileContentType;
59
}
60
61
@SuppressWarnings("deprecation")
62
@Override
63
public String execute() throws Exception
{
64
InputStream is = new FileInputStream(file);
65
String root = ServletActionContext.getRequest().getRealPath("/upload");
66
File destFile = new File(root, this.getFileFileName());
67
OutputStream os = new FileOutputStream(destFile);
68
byte[] buffer = new byte[400];
69
70
int length = 0;
71
72
while ((length = is.read(buffer)) > 0)
{
73
os.write(buffer, 0, length);
74
}
75
is.close();
76
os.close();
77
return SUCCESS;
78
}
79
}

2

3

4

5

6

7

8

9

10

11

12

13

14



15

16

17

18

19

20

21



22

23

24

25



26

27

28

29



30

31

32

33



34

35

36

37



38

39

40

41



42

43

44

45



46

47

48

49



50

51

52

53



54

55

56

57



58

59

60

61

62

63



64

65

66

67

68

69

70

71

72



73

74

75

76

77

78

79

结果:


2、多文件上传
修改action






















































3、任意数量文件上传
在多文件上传的基础上修改upload3.jsp





































结果:

(四)文件上传类型、大小的限制
使用struts的拦截器,struts2-core-2.1.6.jar/org.apache.struts2.interceptor.FileUploadInterceptor.class的源码中我们可以看到:
























报错信息:

(五)文件的下载
download.jsp

1
package
com.test.action;
2
3
import
java.io.InputStream;
4
5
import
org.apache.struts2.ServletActionContext;
6
7
import
com.opensymphony.xwork2.ActionSupport;
8
9
public
class
DownloadAction
extends
ActionSupport
{
10
public InputStream getDownloadFile()
{
11
return ServletActionContext.getServletContext().getResourceAsStream(
12
"/upload/intrl.ppt");
13
}
14
15
@Override
16
public String execute() throws Exception
{
17
return SUCCESS;
18
}
19
}
20
web.xml中action配置

2

3

4

5

6

7

8

9



10



11

12

13

14

15

16



17

18

19

20














FROM:http://www.cnitblog.com/intrl/archive/2009/04/18/56447.html