原文地址:http://www.blogjava.net/duduli/archive/2008/11/11/239845.html
昨天让这个乱码问题弄了很久,一大早就开始想要怎么解决才好。
很简单上传页面,jsp上传页面代码
1
<
form
action
="/struts2/UploadServlet"
method
="post"
enctype
="multipart/form-data"
>
2
用户名:
<
input
type
="text"
name
="username"
><
br
>
3
密 码:
<
input
type
="password"
name
="password"
><
br
>
4
文件1:
<
input
type
="file"
name
="file1"
><
br
>
5
文件2:
<
input
type
="file"
name
="file2"
><
br
>
6
<
input
type
="submit"
value
="提交"
>
7
</
form
>

2

3

4

5

6

7

下面是UploadServlet代码
1
@SuppressWarnings(
"
serial
"
)
2
public
class
UploadServlet
extends
HttpServlet
{
3
4
@SuppressWarnings(
{
"
unchecked
"
,
"
deprecation
"
}
)
5
public
void
doPost(HttpServletRequest request, HttpServletResponse response)
6
throws
ServletException, IOException
{
7
//
设置工厂
8
DiskFileItemFactory factory
=
new
DiskFileItemFactory();
9
String path
=
request.getRealPath(
"
/upload
"
);
10
//
设置文件存储位置
11
factory.setRepository(
new
File(path));
12
//
设置大小,如果文件小于设置大小的话,放入内存中,如果大于的话则放入磁盘中
13
factory.setSizeThreshold(
1024
*
1024
);
14
15
ServletFileUpload upload
=
new
ServletFileUpload(factory);
16
//
这里就是中文文件名处理的代码,其实只有一行,serheaderencoding就可以了
17
upload.setHeaderEncoding(
"
utf-8
"
);
18
/*
String enCoding = request.getCharacterEncoding();
19
if(enCoding != null){
20
upload.setHeaderEncoding(enCoding);
21
}
*/
22
23
try
{
24
List
<
FileItem
>
list
=
upload.parseRequest(request);
25
for
(FileItem item : list)
{
26
//
判断是不是上传的文件,如果不是得到值,并设置到request域中
27
//
这里的item.getfieldname是得到上传页面上的input上的name
28
if
(item.isFormField())
{
29
String name
=
item.getFieldName();
30
String value
=
item.getString(
"
utf-8
"
);
31
System.out.println(name);
32
System.out.println(value);
33
request.setAttribute(name, value);
34
}
35
//
如果是上传的文件,则取出文件名,
36
else
{
37
String name
=
item.getFieldName();
38
String value
=
item.getName();
39
System.out.println(name);
40
System.out.println(value);
41
//
得到不要地址的文件名,不同的浏览器传递的参数不同,有的直接传递文件名,而又的把文件地址一起传递过来
42
//
使用substring方法可以统一得到文件名而不得到文件位置
43
int
start
=
value.lastIndexOf(
"
\\
"
);
44
String fileName
=
value.substring(start
+
1
);
45
request.setAttribute(name, fileName);
46
//
写文件到path目录,文件名问filename
47
item.write(
new
File(path,fileName));
48
}
49
}
50
}
51
52
catch
(FileUploadException e)
{
53
e.printStackTrace();
54
}
catch
(Exception e)
{
55
e.printStackTrace();
56
}
57
//
跳转到显示结果页面
58
request.getRequestDispatcher(
"
upload/result2.jsp
"
).forward(request, response);
59
}
60
61
}

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

用EL表达式显示输出
1
<
body
>
2
用户名:${requestScope.username }
<
br
>
3
密 码:${requestScope.password }
<
br
>
4
文件1 :${requestScope.file1 }
<
br
>
5
文件2 :${requestScope.file2 }
<
br
>
6
</
body
>

2

3

4

5

6

其实很简单的设置就可以把中文件上传,并正确显示正确的中文文件名。
在网上找了一点资料,但是都写得很少,没有把完整的写出来。
所以把它写出来,让大家少走点弯路。