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>