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("您的登录信息已经过期,请重新登录!\n\nHTTP响应码:" + xhr.status);
            // location.href = "login.html";
        }
    });
});    
</script>

 

posted on 2020-03-10 11:48  零度的脚步  阅读(5406)  评论(0编辑  收藏  举报

导航