原文: https://howtodoinjava.com/spring-mvc/spring-mvc-multi-file-upload-example/

Spring MVC 为任何应用程序中的多文件上传功能提供了开箱即用的支持。 本教程使用CommonsMultipartResolver,并且需要 apache commons 文件上载apache commons io 依赖项。

pom.xml

  1. <dependency>
  2. <groupId>commons-fileupload</groupId>
  3. <artifactId>commons-fileupload</artifactId>
  4. <version>1.3.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>commons-io</groupId>
  8. <artifactId>commons-io</artifactId>
  9. <version>2.6</version>
  10. </dependency>

1. Spring MVC MultipartFile接口

上传到 Spring MVC 应用程序的文件将包装在MultipartFile对象中。 我们需要做的就是编写一个属性类型为MultipartFile的域类。 该界面具有获取上传文件的名称和内容的方法,例如 getBytes()getInputStream()getOriginalFilename()getSize()isEmpty()tranferTo()

例如,要将上传的文件保存到文件系统,我们可以使用transferTo方法:

文件上传到文件系统

  1. File file = new File(...);
  2. multipartFile.transferTo(file);

2. 用于文件上传的域类

您需要创建一个具有必要属性的简单域类,并创建一个用于存储List<MultipartFile>类型的文件的域类。

为了构建此示例,我编写了此域类。

Product.java

  1. public class Product implements Serializable
  2. {
  3. private static final long serialVersionUID = 74458L;
  4. @NotNull
  5. @Size(min=1, max=10)
  6. private String name;
  7. private String description;
  8. private List<MultipartFile> images;
  9. //getters and setters
  10. }

3. Spring MVC 多文件上传控制器

在控制器类中,我们将在域类中获取上载文件的预填充详细信息。 只需获取详细信息,然后根据应用程序设计将文件存储在文件系统或数据库中即可。

DemoProductController.java

  1. @Controller
  2. public class DemoProductController
  3. {
  4. @RequestMapping("/save-product")
  5. public String uploadResources( HttpServletRequest servletRequest,
  6. @ModelAttribute Product product,
  7. Model model)
  8. {
  9. //Get the uploaded files and store them
  10. List<MultipartFile> files = product.getImages();
  11. List<String> fileNames = new ArrayList<String>();
  12. if (null != files && files.size() > 0)
  13. {
  14. for (MultipartFile multipartFile : files) {
  15. String fileName = multipartFile.getOriginalFilename();
  16. fileNames.add(fileName);
  17. File imageFile = new File(servletRequest.getServletContext().getRealPath("/image"), fileName);
  18. try
  19. {
  20. multipartFile.transferTo(imageFile);
  21. } catch (IOException e)
  22. {
  23. e.printStackTrace();
  24. }
  25. }
  26. }
  27. // Here, you can save the product details in database
  28. model.addAttribute("product", product);
  29. return "viewProductDetail";
  30. }
  31. @RequestMapping(value = "/product-input-form")
  32. public String inputProduct(Model model) {
  33. model.addAttribute("product", new Product());
  34. return "productForm";
  35. }
  36. }

4. Spring MVC 配置更改

为了支持多部分请求,我们需要在配置文件中声明multipartResolver bean。

beans.xml

  1. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  2. <property name="maxUploadSize" value="20848820" />
  3. </bean>

等效的 Java 注解配置为:

  1. @Bean(name = "multipartResolver")
  2. public CommonsMultipartResolver multipartResolver()
  3. {
  4. CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
  5. multipartResolver.setMaxUploadSize(20848820);
  6. return multipartResolver;
  7. }

此外,我们可能希望将服务器上的文件存储路径映射为资源。 这将是 spring mvc 文件上传目录。

  1. <mvc:resources mapping="/image/**" location="/image/" />

本示例使用的完整配置文件为:

beans.xml

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context/
  8. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
  11. <context:component-scan base-package="com.howtodoinjava.demo" />
  12. <mvc:resources mapping="/image/**" location="/image/" />
  13. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
  14. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/views/" />
  17. <property name="suffix" value=".jsp" />
  18. </bean>
  19. <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  20. <property name="basename" value="messages" />
  21. </bean>
  22. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  23. <property name="maxUploadSize" value="20848820" />
  24. </bean>
  25. </beans>

5. Spring MVC 视图上传文件

我已经写了两个 JSP 文件。 一个用于显示文件上传表单,用户将在其中填写其他详细信息并选择要上传的文件。 其次,我们将显示带有其他详细信息的上传文件。

productForm.jsp

  1. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <title>Add Product Form</title>
  7. </head>
  8. <body>
  9. <div id="global">
  10. <form:form commandName="product" action="save-product" method="post" enctype="multipart/form-data">
  11. <fieldset>
  12. <legend>Add a product</legend>
  13. <p>
  14. <label for="name">Product Name: </label>
  15. <form:input id="name" path="name" cssErrorClass="error" />
  16. <form:errors path="name" cssClass="error" />
  17. </p>
  18. <p>
  19. <label for="description">Description: </label>
  20. <form:input id="description" path="description" />
  21. </p>
  22. <p>
  23. <label for="image">Product Images: </label>
  24. <input type="file" name="images" multiple="multiple"/>
  25. </p>
  26. <p id="buttons">
  27. <input id="reset" type="reset" tabindex="4">
  28. <input id="submit" type="submit" tabindex="5" value="Add Product">
  29. </p>
  30. </fieldset>
  31. </form:form>
  32. </div>
  33. </body>
  34. </html>

viewProductDetail.jsp

  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Save Product</title>
  6. </head>
  7. <body>
  8. <div id="global">
  9. <h4>The product has been saved.</h4>
  10. <h5>Details:</h5>
  11. Product Name: ${product.name}<br/>
  12. Description: ${product.description}<br/>
  13. <p>Following files are uploaded successfully.</p>
  14. <ol>
  15. <c:forEach items="${product.images}" var="image">
  16. <li>${image.originalFilename}
  17. <img width="100" src="<c:url value="/image/"/>${image.originalFilename}"/>
  18. </li>
  19. </c:forEach>
  20. </ol>
  21. </div>
  22. </body>
  23. </html>

Spring MVC 多文件上传示例

当我们用http://localhost:8080/springmvcexample/product-input-form进入浏览器时,我们得到以下屏幕:

Spring MVC 多文件上传示例 - 图1

Spring MVC 文件上传表单

我们填写详细信息并提交表格,我们将在其他页面中获取提交的详细信息和所有上传的文件:

Spring MVC 多文件上传示例 - 图2

文件成功上传

在与 spring mvc 多文件上传示例相关的评论部分中,向我提出您的问题和建议。

学习愉快!