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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM