• Spring MVC,文件上传


    本文引用自:《Java EE企业级应用开发教程》

    通常情况下,文件上传都是通过表单形式提交给后台服务器;表单必须满足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目录之下。

  • 相关阅读:
    Firefox浏览器怎么安装adobe flash player插件
    uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案...
    thinkphp模版调用函数方法
    Thinkphp模板中函数的使用
    60.0.1(64位)windows版 uploadify使用有问题
    一起谈.NET技术,异步调用与多线程的区别 狼人:
    一起谈.NET技术,Silverlight中使用递归构造关系图 狼人:
    一起谈.NET技术,ASP.NET Routing对请求的处理方式 狼人:
    一起谈.NET技术,闲话“多线程” 狼人:
    一起谈.NET技术,利用.NET Framework4.0的源代码调试你的应用程序 狼人:
  • 原文地址:https://www.cnblogs.com/nayitian/p/15378399.html
Copyright © 2020-2023  润新知