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>
  • 相关阅读:
    Pandas索引和选择数据
    Pandas选项和自定义
    Pandas字符串和文本数据
    Pandas排序
    Pandas迭代
    Pandas重建索引
    Pandas函数应用
    Pandas描述性统计
    Pandas基本功能
    nyoj 234 吃土豆
  • 原文地址:https://www.cnblogs.com/chenglaoshi/p/12454742.html
Copyright © 2011-2022 走看看