Spring MVC-09循序漸進之文件上傳(基于Apache Commons FileUpload)

      網友投稿 697 2025-03-31

      概述

      客戶端編程

      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

      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

      Spring MVC-09循序漸進之文件上傳(基于Apache Commons FileUpload)

      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小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:python基礎字符串(七)
      下一篇:怎么在Excel中一列分成多列?Excel一列分成多列的方法
      相關文章
      jzzijzzij在线观看亚洲熟妇| 亚洲最大视频网站| 亚洲一本综合久久| 激情综合色五月丁香六月亚洲| 亚洲午夜成人精品无码色欲| 亚洲毛片免费观看| 久久久无码精品亚洲日韩京东传媒| 亚洲熟妇无码另类久久久| 亚洲亚洲人成综合网络| MM131亚洲国产美女久久| 亚洲高清无码专区视频| 亚洲高清无码专区视频| 亚洲国产精品专区在线观看| 亚洲美女在线国产| 国产自偷亚洲精品页65页| 国产亚洲人成网站在线观看| 国产亚洲AV夜间福利香蕉149 | 亚洲高清视频在线播放| 国产亚洲一区二区三区在线不卡| 亚洲av乱码中文一区二区三区| 亚洲乱码av中文一区二区| 亚洲AV无码男人的天堂| 亚洲AV无码成H人在线观看| 亚洲精品视频免费| 久久久久亚洲AV无码专区桃色| 青青草原亚洲视频| 亚洲成AV人片一区二区| 精品国产综合成人亚洲区| 亚洲成A人片在线观看无码不卡 | 亚洲国产香蕉碰碰人人| 久久精品国产亚洲av高清漫画| 亚洲韩国—中文字幕| 亚洲无圣光一区二区| 亚洲情A成黄在线观看动漫软件| 亚洲人成人伊人成综合网无码| 亚洲人成人伊人成综合网无码| 在线观看免费亚洲| 日本亚洲国产一区二区三区| 久久久久亚洲av无码尤物| 亚洲电影免费观看| 亚洲精品无码久久久久秋霞|