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>