zoukankan      html  css  js  c++  java
  • Springboot实现文件(头像)上传

    Springboot实现文件的上传

      首先需要添加 MultipartFile 这个类,这个类中提供了大量的关于上次文件的操作,其中执行上次的transferTo方法执行保存的方法。其中有:

           /**
                 * MultipartFile相关API
                 * String getOriginalFileName(); 获取上传文件的原始文件名。
                 * boolean isEmpty(); 判断上传文件是否为空,当没有选择上传的文件或者上传的文件字节数位0的空文件时,返回true
                 * long getSize(); 获取文件的大小,以字节为单位
                 * String getContentType(); 根据上传的文件拓展名决定该文件的MIME类型,如:.jpg,将返回image/jpeg
                 * InputStream getInputStream();获取读取上传文件的输入字节流,通常用于自定义读取所上传文件的过程,该方法与transferTo()方法不可同时使用。
                 * void transferTo(File dest); 保存上传文件,该方法不能与getInputStream()同用。
                 */

    注意:

      springboot强制要求,用户上传的文件大小为1M. 由于springboot有内置的服务器,所以上传的文件应该是在wtpwebapps文件下是可以找到的!当再次跑动项目后应该是不存了;为了保存下用户每次上次的数据,那么,我们就需要在服务端指定一个用户上传到服务的文件的存放位置(就是个文件夹),而这个文件的创建是在webapp下完成的。所以确定文件是否上传成功,就可以在webapp文件夹下指定的文件夹里找(我指定的文件夹是upload),还有一种方式就是通过数据库查询指定字段来确定是否上传成功。

    --- 此项目没有对上传的文件类型和大小做任何的限制。需要做限制操作可以转看我撰写的:SpringMVC实现文件上传文章。

    ==============大致实现代码如下===============

    Controller层的文件上传实现代码:

    @RequestMapping("update_avatar")
        public JsonResult<String> uploadAvatar(@RequestParam(value = "file")MultipartFile file,
                HttpServletRequest request) throws IllegalStateException, IOException{
            //1.确定保存的文件夹
            String dirPath = request.getServletContext().getRealPath("upload");//会在webapp下面创建此文件夹
            System.out.println("dirPath="+dirPath);
            
            File dir = new File(dirPath);
            if(!dir.exists()) {
                dir.mkdirs();
            }
            //2.确定保存的文件名
            String orginalFilename = file.getOriginalFilename();
            int beginIndex = orginalFilename.lastIndexOf(".");
            String suffix ="";
            if(beginIndex!=-1) {
                suffix = orginalFilename.substring(beginIndex);
            }
            String filename =UUID.randomUUID().toString()+suffix;
            //创建文件对象,表示要保存的头像文件,第一个参数表示存储的文件夹,第二个参数表示存储的文件
            File dest = new File(dir,filename);
            //执行保存
            file.transferTo(dest);
            //更新数据表
            String avatar = "/upload/"+filename;
            Integer uid = Integer.valueOf(request.getSession().getAttribute("uid").toString());
            // 通过uid找到用户
            User results = userService.getByUid(uid);
            userService.changeAvatar(results.getUid(), avatar);
            JsonResult<String> jr = new JsonResult<>();
            jr.setState(OK);
            jr.setData(avatar);
             return jr;
        }

    Service层实现代码:

       /**
         * 更新用户头像
         * @param uid 用户id
         * @param avatar 用户头像
         * @throws UpdateException 更新时发生异常
         * @throws UserNotFoundException 用户找不到异常
         */
        @Override
        public void changeAvatar(Integer uid, String avatar) {
         //通过uid查询此用户是否存在 User results
    = userMapper.findByUid(uid); if(results == null ){ throw new UserNotFoundException("头像更新失败!没有找到该用户。"); } if( results.getIsDelete().equals(1)){ throw new UserNotFoundException("头像更新失败!没有找到该用户。"); } String modifiedUser = results.getUsername(); Date modifiedTime = new Date(); Integer rows = userMapper.modifiedAvatarById(uid, avatar, modifiedUser, modifiedTime); if(rows != 1) { throw new UpdateException("头像更新失败!更新时发送未知错误。"); } }

    Dao层的接口Java代码:

    /**
         * 修改头像
         * @param uid 用户id
         * @param avatar 用户头像
         * @param modifiedUser 修改头像的用户
         * @param modifiedTime 修改头像的时间
         * @return 受影响的行数
         */ 
        Integer modifiedAvatarById(
            @Param("uid")Integer uid,
            @Param("avatar")String avatar,
            @Param("modifiedUser")String modifiedUser,
            @Param("modifiedTime")Date modifiedTime);

    Mapper映射的sql语句:

    <update id="modifiedAvatarById">
            update t_user
            set avatar =#{avatar},modified_user =#{modifiedUser},modified_time =#{modifiedTime}
            where uid = #{uid}
    </update>

    前端htnl页面部分代码:

    <!--上传头像表单开始-->
     <form id="form-upload" class="form-horizontal" role="form">
         <div class="form-group">
             <label class="col-md-2 control-label">选择头像:</label>
                   <div class="col-md-1">
                        <img src="../images/index/user.jpg" class="img-responsive" />
                   </div>
                   <div class="clearfix"></div>
                   <div class="col-md-offset-2 col-md-4">
                        <input name="file" type="file">
                   </div>
         </div>
         <div class="form-group">
              <div class="col-sm-offset-2 col-sm-10">
                   <input id="form-btn" type="button" class="btn btn-primary" value="上传" />
              </div>
         </div>
     </form>

    Ajax部分的代码:

    <script type="text/javascript">
    $("#form-btn").click(function() {
        $.ajax({
            "url":"/users/update_avatar",
            "data":new FormData($("#form-upload")[0]),
            "processData":false,
          "contentType":false,
           "type":"POST",
            "dataType":"json",
            "success":function(json) {
                if (json.state == 100) {
                    alert("修改成功!");
                    //$("#img-avatar").attr("src", json.data);
                } else {
                    alert("修改失败!" + json.message + "");
                }
            },
            "error":function(xhr) {
                alert("您的登录信息已经过期,请重新登录!
    
    HTTP响应码:" + xhr.status);
                // location.href = "login.html";
            }
        });
    });    
    </script>
  • 相关阅读:
    随笔2
    随笔
    关于updateElement接口
    随笔1
    本地访问正常,服务器访问乱码 记录
    Redis (error) NOAUTH Authentication required.解决方法
    tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
    微信公众号消息回复
    微信公众号 报token验证失败
    idea中web.xml报错 Servlet should have a mapping
  • 原文地址:https://www.cnblogs.com/chenglaoshi/p/12454742.html
Copyright © 2011-2022 走看看