Spring MVC,文件上传

Posted 那些年的事儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC,文件上传相关的知识,希望对你有一定的参考价值。

通常情况下,文件上传都是通过表单形式提交给后台服务器;表单必须满足3个条件:

  • 表单的method属性设置为post
  • 表单的enctype属性设置为multipart/form-data
  • 提供类似于<input id="file" type="file" name="uploadfile" multiple="multiple" />的文件上传输入框

其中,input元素的multiple是html5的新属性,允许用户选择多个文件进行上传。

Spring MVC为文件上传提供支持,这种支持通过MultipartResolver接口的实现类CommonsMultipartResolver完成。需要在配置文件中定义MultipartResolver接口的Bean,此处配置同样可以决定文件编码格式和上传文件的最大值(属性:defaultEncoding、maxUploadSize)。

CommonsMultipartResolver是Spring MVC内部通过Apache Commons FileUpload技术实现,所以Spring MVC的文件上传需要依赖Apache Commons FileUpload组件。

步骤一、导入依赖包,修改Maven的pom.xml

        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

步骤二、在web.xml中,配置Spring MVC的前端控制器信息

具体参考:Spring MVC,基于注解的Spring MVC应用

步骤三、修改springmvc-config.xml,增加如下代码:

    <!-- 配置文件上传解析器 MultipartResolver -->
    <bean id="multipartResolver" class=
   "org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <!-- 设置请求编码格式-->
          <property name="defaultEncoding" value="UTF-8" />
    </bean>

步骤四、创建文件上传页面fileUpload.jsp,位于WebContent根目录

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
<script>
// 判断是否填写上传人并已选择上传文件
function check(){
    var name = document.getElementById("name").value;
    var file = document.getElementById("file").value;
    if(name==""){
        alert("填写上传人");
        return false;
    }
    if(file.length==0||file==""){
        alert("请选择上传文件");
        return false;
    }
    return true;
}
</script>
</head>
<body>
    <form action="${pageContext.request.contextPath }/fileUpload"
    method="post" enctype="multipart/form-data" onsubmit="return check()">
    上传人:<input id="name" type="text" name="name" /><br />
    请选择文件:<input id="file" type="file" name="uploadfile" 
                                                   multiple="multiple" /><br />
               <input type="submit" value="上传" />
    </form>
</body>
</html>

注意:只有填写了上传人,并且选择需要上传的文件后,才能正常提交表单

步骤五、在WEB-INF/jsp目录中,创建uploadSuccess.jsp/uploadError.jsp

uploadSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    文件上传成功!
</body>
</html>

uploadError.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    文件上传失败,请重新上传!
</body>
</html>

步骤六、创建控制器类

package com.itheima.controller;
import java.io.File;
import java.net.URLEncoder;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
/**
 * 文件上传
 */
@Controller
public class FileUploadController {
    /**
     * 执行文件上传
     */
    @RequestMapping("/fileUpload")
    public String handleFormUpload(@RequestParam("name") String name,
            @RequestParam("uploadfile") List<MultipartFile> uploadfile,
            HttpServletRequest request) {
        // 判断所上传文件是否存在
        if (!uploadfile.isEmpty() && uploadfile.size() > 0) {
            //循环输出上传的文件
            for (MultipartFile file : uploadfile) {
                // 获取上传文件的原始名称
                String originalFilename = file.getOriginalFilename();
                // 设置上传文件的保存地址目录
                String dirPath = 
                       request.getServletContext().getRealPath("/upload/");
                File filePath = new File(dirPath);
                // 如果保存文件的地址不存在,就先创建目录
                if (!filePath.exists()) {
                    filePath.mkdirs();
                }
                // 使用UUID重新命名上传的文件名称(上传人_uuid_原始文件名称)
                String newFilename = name+ "_"+UUID.randomUUID() + 
                                                   "_"+originalFilename;
                try {
                    // 使用MultipartFile接口的方法完成文件上传到指定位置
                    file.transferTo(new File(dirPath + newFilename));
                } catch (Exception e) {
                    e.printStackTrace();
                       return"error";
                }
            }
            // 跳转到成功页面
            return "uploadSuccess";
        }else{
            return"uploadError";
        }
    }
}

步骤七、测试,打开页面:http://localhost:8080/ssm/fileUpload.jsp

 输入上传人,选择文件,提交,文件将存放于WebContent/upload目录之下。

以上是关于Spring MVC,文件上传的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 2 和 Spring MVC 中上传带有其他表单字段的文件

Spring MVC 之文件上传

java spring mvc 客户端上传文件到服务器端

Spring MVC 文件上传功能详解

Spring MVC 上传文件

spring mvc 文件上传怎么过滤文件类型,如exe文件等