Spring MVC-09循序渐进之文件上传(基于Apache Commons FileUpload)

网友投稿 571 2022-05-29

概述

客户端编程

MultipartFile接口

利用Commons FileUpload上传文件

Domain类

控制器

配置文件

JSP页面

部署及测试

源码

概述

Servlet出现之前,文件上传的开发比较困难,主要涉及在服务端解析原始的HTTP响应。 03年Apache发布了开源的Commons FileUplaod组件,极大地提高了文件上传的开发效率。

经过很多年,Servlet的设计人员才意识到文件上传的重要性,最终文件上传还是成了Servlet3的内置特性。

因此,在SpringMVC中处理文件上传主要有两种方法

利用Apache Commons FileUpload组件

利用Servlet3.0及其更高版本的内置支持

本篇博文我们探讨利用Apache Commons FileUpload组件来实现文件的上传

客户端编程

为了上传文件,必须将HTML表格的enctype属性设置为 multipart/form-data

如下

Select a file

1

2

3

4

表格中必须包含类型为file的一个input元素,它会显示成一个按钮,点击时会打开一个对话框,用来选择文件。

HTML之前,如果要上传多个文件,需要使用多个input元素。 但是HTML5中,通过input元素中一如多个multiple属性,使得多个文件的上传更加简单。 在HTML5中编写以下任意一行代码,遍可以生成一个按钮选择多个文件

1

2

3

MultipartFile接口

上传到Spring MVC应用程序中的文件会被包装在一个MultipartFile对象中,我们仅仅用类型为MultipartFile的属性编写一个domain类即可

接口方法如下

利用Commons FileUpload上传文件

只有实现了Servlet3.0及其更高版本规范的Servlet容器,才支持文件上传。 对于低于Servlet3.0的容器,则需要使用Apache Commons FileUpload组件

maven依赖如下

commons-fileupload commons-fileupload 1.3.1

1

2

3

4

5

我们使用1.3.1的版本

Domain类

我们的dimain类 Product,有一个类型为List< MultipartFile >的images属性

package com.artisan.domain; import java.io.Serializable; import java.util.List; import javax.validation.constraints.Size; import org.hibernate.validator.constraints.NotBlank; import org.springframework.web.multipart.MultipartFile; public class Product implements Serializable { private static final long serialVersionUID = -5379168879247929742L; @NotBlank @Size(min = 1, max = 10) private String name; private String description; private float price; //在Domain类中加入MultipartFile类型的属性,用来保存上传的文件 private List images; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public List getImages() { return images; } public void setImages(List images) { this.images = images; } }

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

控制器

控制器有两个处理请求的方法,inputProduct方法向浏览器返回一个产品表单,saveProduct方法将上传的文件保存到指定目录下

package com.artisan.controller; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; import com.artisan.domain.Product; @Controller @RequestMapping("/product") public class ProductController { private static final Logger logger = Logger.getLogger(ProductController.class); @RequestMapping(value="/product_input",method=RequestMethod.GET) public String inputProduct(Model model){ model.addAttribute("product",new Product()); return "ProductForm"; } @RequestMapping(value="/product_save",method=RequestMethod.POST) public String saveProduct(HttpServletRequest servletRequest,@ModelAttribute Product product, BindingResult bindingResult, Model model) { List files = product.getImages(); List fileNames = new ArrayList(); if (null != files && files.size() > 0) { for (MultipartFile multipartFile : files) { String fileName = multipartFile.getOriginalFilename(); logger.info("fileName:" + fileName); fileNames.add(fileName); // 上传后的文件保存目录及名字 File imageFile = new File("D:/", fileName); try { // 转存文件 multipartFile.transferTo(imageFile); logger.info("save image successfully"); } catch (IOException e) { e.printStackTrace(); } } } // save product here model.addAttribute("product", product); return "ProductDetails"; } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Spring MVC-09循序渐进之文件上传(基于Apache Commons FileUpload)

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

保存文件只需要在MultipartFile调用transferTo方法即可,非常便捷简单。

配置文件

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

利用multipartResolver bean中的各种属性设置合理的文件上传限制条件。

JSP页面

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> Add Product Form

Add a product

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

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> Save Product

The product has been saved.

Details:
Product Name: ${product.name}
Description: ${product.description}
Price: $${product.price}

Following files are uploaded successfully.

    ${image.originalFilename}

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

部署及测试

看到目标目录D盘:

上传成功。

源码

代码已提交到github

https://github.com/yangshangwei/SpringMvcTutorialArtisan

Apache MVC Servlet Spring

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为云GaussDB数据库认证助力DBA乘风破浪
下一篇:Kubernetes手记(17)- 调度策略
相关文章