Spring MVC在任何应用程序中提供了对文件上传功能的支持。本教程使用org.springframework.web.multipart.commons.CommonsMultipartResolver并要求apache commons fileuploadapache commons io依赖关系。

Spring的MultipartFile界面

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

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

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

编写文件上传的域类

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

为了建立这个例子,我写了这个域的clas:

public class Product implements Serializable
{
    private static final long serialVersionUID = 74458L;
 
    @NotNull
    @Size(min=1, max=10)
    private String name;
    private String description;
 
    private List<MultipartFile> 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 List<MultipartFile> getImages() {
        return images;
    }
    public void setImages(List<MultipartFile> images) {
        this.images = images;
    }
}

编写文件上传控制器

在控制器类中,您将获得域类中上传文件的预填充详细信息。只需获取详细信息并按照应用程序设计将文件存储在文件系统或数据库中即可。

@Controller
public class DemoProductController
{
    @RequestMapping("/save-product")
    public String uploadResources( HttpServletRequest servletRequest,
                                 @ModelAttribute Product product,
                                 Model model)
    {
        //Get the uploaded files and store them
        List<MultipartFile> files = product.getImages();
        List<String> fileNames = new ArrayList<String>();
        if (null != files && files.size() > 0)
        {
            for (MultipartFile multipartFile : files) {
 
                String fileName = multipartFile.getOriginalFilename();
                fileNames.add(fileName);
 
                File imageFile = new File(servletRequest.getServletContext().getRealPath("/image"), fileName);
                try
                {
                    multipartFile.transferTo(imageFile);
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
 
        // Here, you can save the product details in database
         
        model.addAttribute("product", product);
        return "viewProductDetail";
    }
     
    @RequestMapping(value = "/product-input-form")
    public String inputProduct(Model model) {
        model.addAttribute("product"new Product());
        return "productForm";
    }
}

Spring MVC配置文件的变化

为了支持多部分的请求,你需要在配置文件中声明下面的bean。

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

另外,您可能希望将服务器上的文件存储路径映射为资源。

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

用于这个例子的完整配置文件是:

    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context/
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
 
    <context:component-scan base-package="com.howtodoinjava.demo" />
     
    <mvc:resources mapping="/image/**" location="/image/" />
 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
     
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
     
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages" />
    </bean>
     
    <bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="20848820" />
    </bean>
     
</beans>

建立文件上传的客户端代码

我写了两个JSP文件。一个用于显示文件上传表单,其中用户将填写其他细节并选择要上传的文件。其次,我们将显示其他细节的上传文件。

productForm.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title>Add Product Form</title>
</head>
<body>
    <div id="global">
        <form:form commandName="product" action="save-product" method="post" enctype="multipart/form-data">
            <fieldset>
                <legend>Add a product</legend>
                <p>
                    <label for="name">Product Name: </label>
                    <form:input id="name" path="name" cssErrorClass="error" />
                    <form:errors path="name" cssClass="error" />
                </p>
                <p>
                    <label for="description">Description: </label>
                    <form:input id="description" path="description" />
                </p>
                <p>
                    <label for="image">Product Images: </label>
                    <input type="file" name="images" multiple="multiple"/>
                </p>
                <p id="buttons">
                    <input id="reset" type="reset" tabindex="4">
                    <input id="submit" type="submit" tabindex="5" value="Add Product">
                </p>
            </fieldset>
        </form:form>
    </div>
</body>
</html>

viewProductDetail.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<title>Save Product</title>
</head>
<body>
<div id="global">
    <h4>The product has been saved.</h4>
        <h5>Details:</h5>
        Product Name: ${product.name}<br/>
        Description: ${product.description}<br/>
        <p>Following files are uploaded successfully.</p>
        <ol>
        <c:forEach items="${product.images}" var="image">
            <li>${image.originalFilename}
            <img width="100" src="<c:url value="/image/"/>${image.originalFilename}"/>
            </li>
        </c:forEach>
        </ol>
</div>
</body>
</html>

运行应用程序

当你点击浏览器时http://localhost:8080/springmvcexample/product-input-form,你会看到以下屏幕:

Spring MVC多文件上传示例Spring MVC文件上传的形式

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

Spring MVC多文件上传示例文件上传成功

在评论部分给我提问你的问题和建议。

快乐学习!

相关文章:

  • 2021-12-24
  • 2018-04-27
  • 2021-12-17
  • 2021-07-29
  • 2021-07-10
  • 2022-01-05
  • 2021-07-22
猜你喜欢
  • 2022-01-21
  • 2022-03-06
  • 2021-11-26
  • 2021-11-04
  • 2021-12-05
  • 2021-09-09
  • 2021-08-04
相关资源
相似解决方案