史上最简单的接收multipart form-data文件教程

今天遇到一个坑,这里给大家介绍一下。

现在很多文件上传类型都是multipart/form-data类型的,HTTP请求如下所示:



可是问题就在于如果用传统的Struts2或者servlet等都可以很容易的实现文件接收的功能,例如下面的代码就可以实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
boolean isMultipart = ServletFileUpload.isMultipartContent(request);//判断是否是表单文件类型    

DiskFileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload sfu = new ServletFileUpload(factory);

List items = sfu.parseRequest(request);//从request得到所有上传域的列表

for(Iterator iter = items.iterator();iter.hasNext();){

FileItem fileitem =(FileItem) iter.next();

if(!fileitem.isFormField()&&fileitem!=null){//判读不是普通表单域即是file

System.out.println("name:"+fileitem.getName());

}

}

可是今天我把这一段代码放在SpringBoot上面的时候就怎么也接收不到文件信息了,一直以为是前端什么数据传输错了。后来才知道原来SpringBoot有它自己的接收请求的代码。下面就给大家详细介绍一下它是如何实现这个功能的。

首选做一个简单的案例,也就是单个文件上传的案例。(这个案例是基于SpringBoot上面的,所以大家首先得搭建好SpringBoot这个框架)

前台HTML代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
view plain copy

<html>

<body>

<form action="/upload" method="POST" enctype="multipart/form-data">

<input type="file" name="file"/>

<input type="submit" value="Upload"/>

</form>

</body>

</html>





后台接收代码:

1
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
/**    

* 文件上传具体实现方法;

*

* @param file

* @return

*/

@RequestMapping("/upload")

@ResponseBody

public String handleFileUpload(@RequestParam("file") MultipartFile file) {

if (!file.isEmpty()) {

try {

/*

* 这段代码执行完毕之后,图片上传到了工程的跟路径; 大家自己扩散下思维,如果我们想把图片上传到

* d:/files大家是否能实现呢? 等等;

* 这里只是简单一个例子,请自行参考,融入到实际中可能需要大家自己做一些思考,比如: 1、文件路径; 2、文件名;

* 3、文件格式; 4、文件大小的限制;

*/

BufferedOutputStream out = new BufferedOutputStream(

new FileOutputStream(new File(

file.getOriginalFilename())));

System.out.println(file.getName());

out.write(file.getBytes());

out.flush();

out.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

return "上传失败," + e.getMessage();

} catch (IOException e) {

e.printStackTrace();

return "上传失败," + e.getMessage();

}



return "上传成功";



} else {

return "上传失败,因为文件是空的.";

}

}

这样就可以实现对multipart/form-data类型文件的接收了。那如果是多个文件外加多个字段呢,下面接着看下一个多个文件上传的案例。

前台HTML界面:

1
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
<!DOCTYPE html>      

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"

xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">

<head>

<title>Hello World!</title>

</head>

<body>

<form method="POST" enctype="multipart/form-data" action="/batch/upload">

<p>文件1:<input type="text" name="id" /></p>

<p>文件2:<input type="text" name="name" /></p>

<p>文件3:<input type="file" name="file" /></p>

<p><input type="submit" value="上传" /></p>

</form>

</body>

</html>




后台接收代码:

1
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
@RequestMapping(value = "/batch/upload", method = RequestMethod.POST)      

@ResponseBody

public String handleFileUpload(HttpServletRequest request) {

MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);

List<MultipartFile> files = ((MultipartHttpServletRequest) request)

.getFiles("file");

String name=params.getParameter("name");

System.out.println("name:"+name);

String id=params.getParameter("id");

System.out.println("id:"+id);

MultipartFile file = null;

BufferedOutputStream stream = null;

for (int i = 0; i < files.size(); ++i) {

file = files.get(i);

if (!file.isEmpty()) {

try {

byte[] bytes = file.getBytes();

stream = new BufferedOutputStream(new FileOutputStream(

new File(file.getOriginalFilename())));

stream.write(bytes);

stream.close();

} catch (Exception e) {

stream = null;

return "You failed to upload " + i + " => "

+ e.getMessage();

}

} else {

return "You failed to upload " + i

+ " because the file was empty.";

}

}

return "upload successful";

}

这样就可以实现对多个文件的接收了功能了。SpringBoot还可以对接收文件的格式还有个数等等进行限制,我这里就不多说了,大家有兴趣的可以自己去了解了解。

千万要记住SpringBoot对multipart/form-data类型的文件接收和其它是不一样的,大家以后遇到的时候要千万小心,不要像我一样一往无前的踩进去还傻傻的以为是前端的错误。

更多内容敬请关注:“林老师带你学编程

林老师带你学编程 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!