Spring MVC的文件上传

2019-09-19  本文已影响0人  Dcl_Snow

概述

文件上传是Java Web项目中的常用功能,未达到上传文件的目的,需进行下列步骤:

文件上传示例

示例程序依然在前文的SpringMVCProject项目中完成(前文连接:https://www.jianshu.com/p/fde4557c527c)。

文件上传页面的背景图片

在项目的webapp目录下创建文件夹“images”,放入一张背景图片,命名为“backImage.jpg”:


backImage.png

POM文件配置

在项目的pom文件中添加commons-fileupload依赖:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

创建JSP文件

在项目的webapp目录下创建uploadfile.jsp文件,编写如下程序:

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>uploadfile</title>
    <style type="text/css">
        body{
            background-image: url(images/backImage.jpg);
            background-size:cover;
        }
    </style>
</head>
<body>
<center>
<h3>文件上传页面</h3>
<br>
<form action="upload" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td><label>文件信息:</label></td>
            <td><input type="text" name="information"></td>
        </tr>
        <tr>
            <td><label>选择文件:</label></td>
            <td><input type="file" name="file"></td>
        </tr>
        <tr>
            <td><input type="submit" id="submit" value="上传"></td>
        </tr>
    </table>
</form>
</center>
</body>
</html>

创建Controller类

在com.snow.dcl.controller包下创建UploadFileController类文件,编写如下程序:

@Controller
public class UploadFileController {
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    @ResponseBody
    public String upload(HttpServletRequest request, @RequestParam("information") String information, @RequestParam("file") MultipartFile file) throws IOException {
        if (!file.isEmpty()) {
            String path = request.getServletContext().getRealPath("file");
            String fileName = file.getOriginalFilename();
            File uploadFile = new File(path, fileName);
            if (!uploadFile.getParentFile().exists()) {
                uploadFile.getParentFile().mkdirs();
            }
            file.transferTo(new File(path + File.separator + fileName));
            return "Success!";
        } else {
            return "No File!";
        }
    }
}

在该控制器程序中使用了@ResponseBody注解,可以给前端返回“文件上传成功!”和“未添加上传文件!”的字符串数据,否则在Spring MVC的配置文件springmvc-servlet.xml中配置的是返回视图jsp文件。

springmvc-servlet.xml文件配置

在springmvc-servlet.xml文件中配置MultipartResolver,配置文件增加内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!--spring可以自动扫描base-package设置的包或子包下的java类,如果扫描到有spring相关注解的类,则注册为spring的bean-->
    <context:component-scan base-package="com.snow.dcl.controller"/>

    <mvc:annotation-driven />
    <mvc:default-servlet-handler/>

    <!--视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/content/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 上传文件大小20M以内 -->
        <property name="maxUploadSize">
            <value>20971520</value>
        </property>
        <!-- 请求的编码格式,必须与JSP文件中的pageEncoding属性值相同 -->
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
    </bean>

</beans>

\color{red}{注意:}

  1. 配置MultipartResolver的同时还添加了mvc的命名空间。
  2. 添加<mvc:default-servlet-handler/>配置用来处理背景图片等静态资源。
  3. 添加<mvc:default-servlet-handler/>配置就必须添加<mvc:annotation-driven />否则会出现@Controller注解无法解析的情况,导致请求时候都没有匹配的处理请求类,就都去<mvc:default-servlet-handler/>即default servlet处理了,静态资源(如图片资源)因为没有对应的Controller则会被default servlet处理。

测试

启动TomcatServer,启动完成后,打开浏览器输入:http://localhost:8080/uploadfile.jsp,访问成功。

Spring MVC上传01.png
不添加任何文件,直接提交:
Spring MVC上传03.png
添加测试用的txt文件:
Spring MVC上传02.png
提交:
Spring MVC上传04.png
查看项目目录,在target目录的项目目录下会生成file目录,上传的文件在file目录中:
Spring MVC上传05.png
至此,文件上传功能记录完毕。
上一篇 下一篇

猜你喜欢

热点阅读