美文网首页java面试
SpringBoot--文件上传

SpringBoot--文件上传

作者: aruba | 来源:发表于2022-06-01 15:07 被阅读0次

    前面已经使用过SpringMVC的文件上传,SpringBoot中文件上传和SpringMVC中基本一样,只是少了一些依赖导入

    一、项目配置

    1. 导入依赖

    只需要导入文件服务器转存的依赖:

            <dependency>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-client</artifactId>
                <version>1.19</version>
            </dependency>
    

    2. 配置yml

    和之前的springboot项目对比,只是修改了mybatis的包扫描路径

    mybatis:
      type-aliases-package: com.aruba.download.bean
    
    spring:
      datasource:
        # 使用阿里的Druid连接池
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        # 填写你数据库的url、登录名、密码和数据库名
        url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
        username: root
        password: root
      druid:
        # 连接池的配置信息
        # 初始化大小,最小,最大
        initial-size: 5
        min-idle: 5
        maxActive: 20
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
        # 配置DruidStatFilter
        web-stat-filter:
          enabled: true
          url-pattern: "/*"
          exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
        # 配置DruidStatViewServlet
        stat-view-servlet:
          url-pattern: "/druid/*"
          # IP白名单(没有配置或者为空,则允许所有访问)
          allow: 127.0.0.1,192.168.8.109
          # IP黑名单 (存在共同时,deny优先于allow)
          deny: 192.168.1.188
          #  禁用HTML页面上的“Reset All”功能
          reset-enable: false
          # 登录名
          login-username: admin
          # 登录密码
          login-password: 123456
    

    二、复制代码和资源

    接下来就是cv工作

    1. Java代码的复制

    SpringMVC中是利用的xml配置文件进行MapperScanner的配置,SpringBoot中不需要了,但要给Mapper层加上@Mapper注解:

    @Mapper
    public interface PlayerMapper {
        /**
         * 新增一个玩家
         * @param player
         * @return
         */
        Integer addPlayer(Player player);
    
        /**
         * 获取所有玩家
         * @return
         */
        List<Player> findAllPlayers();
    }
    

    2. 资源文件的复制

    SpringBoot中默认Mybatis的映射文件存放路径为resources目录下的mapper文件夹下。

    再将registerPlayer.jsp改为registerPlayer.html,使用thymeleaf技术,除了删除jsp中的第一行代码,也没有改动:

    <html>
    <head>
        <title>Title</title>
        <script src="js/jquery-1.10.2.min.js"></script>
        <script>
            $(function () {
                $("#upload").click(function () {
                    var imgFile = $("#headImg")[0].files[0]
                    if (imgFile == undefined) {
                        alert("请选择文件")
                        return
                    }
                    console.log(imgFile)
    
                    var formdata = new FormData()
                    formdata.append("img", imgFile)
                    $.ajax({
                        type: "post",
                        data: formdata,
                        url: "uploadImg.do",
                        processData: false,
                        contentType: false,
                        success: function (ret) {
                            console.log(ret)
                            alert(ret.msg)
                            $("#head").attr("src", ret.filepath)
                            $("#filetypeInput").val(ret.filetype)
                            $("#photoInput").val(ret.filepath)
                        },
                        xhr: function () {
                            var xhr = new XMLHttpRequest();
                            //使用XMLHttpRequest.upload监听上传过程,注册progress事件,打印回调函数中的event事件
                            xhr.upload.addEventListener('progress', function (e) {
                                //loaded代表上传了多少
                                //total代表总数为多少
                                var progressRate = (e.loaded / e.total) * 100 + '%';
                                //通过设置进度条的宽度达到效果
                                $('.progress > div').css('width', progressRate );
                            })
                            return xhr;
                        }
                    })
                })
            })
        </script>
    
        <style>
            #head {
                width: 200px;
                height: 200px;
            }
    
            .progress {
                width: 200px;
                height: 10px;
                border: 1px solid #ccc;
                border-radius: 10px;
                margin: 10px 0px;
                overflow: hidden;
            }
    
            /* 初始状态设置进度条宽度为0px */
            .progress > div {
                width: 0px;
                height: 100%;
                background-color: yellowgreen;
                transition: all .3s ease;
            }
        </style>
    </head>
    <body>
    <form action="registerPlayer.do">
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="password" name="password"></p>
        <p>昵称:<input type="text" name="nickname"></p>
        <p>头像:<input id="headImg" type="file">
            <input type="button" id="upload" value="上传文件">
        </p>
        <div class="progress">
            <div></div>
        </div>
        <p><img id="head" alt="未选择图片"></p>
        <input id="filetypeInput" type="hidden" name="filetype">
        <input id="photoInput" type="hidden" name="photo">
        <p><input type="submit" value="注册"></p>
    </form>
    </body>
    </html>
    

    3. Controller层新增跳转页面的处理单元

        @RequestMapping("registerPlayer")
        public String register() {
            return "registerPlayer";
        }
    

    效果:

    三、同步上传

    之前实现的功能为文件的异步上传,即单独一个文件上传的接口。同步上传为一次性上传多个文件以及请求参数

    1. 修改form表单

    <form action="registerPlayer2.do" method="post" enctype="multipart/form-data">
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="password" name="password"></p>
        <p>昵称:<input type="text" name="nickname"></p>
        <p>头像:<input id="headImg" name="photo1" type="file">
            <input id="headImg2" name="photo2" type="file" multiple>
        <div class="progress">
            <div></div>
        </div>
        <p><img id="head" alt="未选择图片"></p>
        <input id="filetypeInput" type="hidden" name="filetype">
        <input id="photoInput" type="hidden" name="photo">
        <p><input type="submit" value="注册"></p>
    </form>
    

    去除了上传图片的按钮,将图片与form表单一起提交

    2. Controller层

    使用MultipartFile接收参数:

        @RequestMapping("registerPlayer2.do")
        @ResponseBody
        public String register2(Player player, @RequestParam("photo1") MultipartFile head, @RequestParam("photo2") MultipartFile[] photos) {
    ...
    
        }
    

    项目地址:

    https://gitee.com/aruba/spring-boot-study.git

    相关文章

      网友评论

        本文标题:SpringBoot--文件上传

        本文链接:https://www.haomeiwen.com/subject/tyexmrtx.html