fileupload上传中文文件名时出现乱码问题
昨天让这个乱码问题弄了很久,一大早就开始想要怎么解决才好。
很简单上传页面,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();

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 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}
用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

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~