ajax+springboot上传图片讲解(修改用户头像)

亦凉 2021-05-07 20:35 1454阅读 0赞

HTTP请求方法说明

在讲解ajax请求实现前,我们先了解一下http常用的6个请求方法:

方法 功能说明
GET 向特定的资源发出请求,url会被标识在浏览器地址栏
POST 向指定资源提交数据进行处理请求,例如提交表单或者上传文件。
PUT 向指定资源位置上传其最新内容
DELETE 请求服务器删除Request所标识的资源
HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头

jquery发送ajax请求,简化原生js发送ajax的繁琐过程

ajax请求主要使用得比较多的两个场景就是,提交普通参数的请求和提交含有文件的请求,
下面我将会通过编写两个小示例来说明

1.第一个使用ajax异步请求修改用户密码的小示例

前端发送异步请求:

  1. function updatePsd() {
  2. var originalPsd = $("#originalPsd").val(); //原密码
  3. var newPsd = $("#newPsd").val(); //新密码
  4. var userId = $("#userId").val(); //用户id
  5. $.ajax({
  6. url: "/updatePassword", //请求url
  7. type: 'POST', //请求方法
  8. data: { //请求参数
  9. "originalPsd": originalPsd,
  10. "newPsd": newPsd,
  11. "userId": userId
  12. },
  13. success: function (data) { //请求成功时调用
  14. $.alert({
  15. title: data.code,
  16. content: data.msg,
  17. });
  18. },
  19. error: function (data) { //请求失败时调用
  20. $.alert({
  21. title: 'Error',
  22. content: '修改密码失败,请稍后重试!',
  23. });
  24. }
  25. });
  26. }

后端controller,使用springboot:

  1. /**
  2. * 登录状态下,修改密码
  3. *
  4. * @return
  5. */
  6. @RequestMapping(value = "/updatePassword")
  7. @ResponseBody
  8. public Map<String,String> changePsd(@RequestParam(value = "userId") String userId,
  9. @RequestParam(value = "originalPsd") String originalPsd,
  10. @RequestParam(value = "newPsd") String newPsd) {
  11. Long Id = Long.parseLong(userId.trim());
  12. String originalPassword = MD5Util.getMD5(originalPsd);
  13. String newPassword = MD5Util.getMD5(newPsd);
  14. boolean flag = userService.updatePasswordByUserId(Id,originalPassword ,newPassword );
  15. Map<String,String> data = new HashMap<>();
  16. if (flag){
  17. data.put("code","success");
  18. data.put("msg","成功修改密码!");
  19. return data;
  20. }else {
  21. data.put("code","error");
  22. data.put("msg","修改密码失败,请稍后重试!");
  23. return data;
  24. }
  25. }

Mapper

  1. UPDATE user set password = #{newPsd}
  2. where user_id = #{userId}
  3. and password = #{originalPsd}

2.第二个使用ajax异步发送formdata修改用户头像的小示例

说明:修改头像,需要上传图片,不同于普通的提交参数,需要使用formdata发送文件数据流

html

  1. <style type="text/css">
  2. .file {
  3. position: relative;
  4. }
  5. .file input {
  6. position: absolute;
  7. font-size: 18px;
  8. right: 0;
  9. top: 0;
  10. opacity: 0;
  11. }
  12. </style>
  13. <div class="col-md-2" style="margin-top: 10px;">
  14. <label class="control-label file">
  15. <div> //原头像
  16. <img id="userUrl" style="border-radius: 100px;" src="${user.userUrl}"> //后端传过来的url
  17. </div>
  18. <input type="file" id="photo">
  19. <input type="hidden" id="userId" value="${user.userId}">
  20. </label>
  21. <p style="margin-left: 20px;">点击头像选择图片,再点击上传</p>
  22. <input id="changeBtn" style="width: 100px;margin-left: 20px;" class="btn btn-info" value="上传">
  23. </div>

页面效果
在这里插入图片描述
js

  1. $("#changeBtn").click(function () {
  2. var formData = new FormData();
  3. formData.append("photo",$('input#photo')[0].files[0]); //拿到提交的图片文件
  4. formData.append("userId",$("#userId").val()); //需要把图片和用户关联起来
  5. $.ajax({
  6. url: "/changePhoto",
  7. type: 'POST',
  8. contentType: false,
  9. processData: false,
  10. data: formData,
  11. success: function (data) { //请求成功时调用
  12. $.alert({
  13. title: data.code,
  14. content: data.msg,
  15. });
  16. $("#userUrl").attr("src", data.userUrl); //使用jquery修改图片的src
  17. },
  18. error: function (data) { //请求失败时调用
  19. $.alert({
  20. title: 'Error',
  21. content: '修改头像失败,请稍后重试!',
  22. });
  23. }
  24. });
  25. });

后端controller

  1. /**
  2. * 修改个人头像
  3. *
  4. * @return
  5. */
  6. @RequestMapping(value = "/changePhoto")
  7. @ResponseBody
  8. public Map<String,String> changePhoto(@RequestParam MultipartFile photo, @RequestParam Long userId){
  9. Map<String,String> data = new HashMap<>();
  10. if (photo.isEmpty()){
  11. data.put("code","error");
  12. data.put("msg","上传图片为空!");
  13. return data;
  14. }
  15. //获取MultipartFile文件的后缀
  16. String suffix = photo.getOriginalFilename().substring(photo.getOriginalFilename().lastIndexOf(".") + 1);
  17. if (suffix.equalsIgnoreCase("jpg") ||
  18. suffix.equalsIgnoreCase("jpeg") ||
  19. suffix.equalsIgnoreCase("png")){
  20. OutputStream os = null;
  21. InputStream inputStream = null;
  22. String fileName = (userId + "") + System.currentTimeMillis() + ".jpg";
  23. String userUrl = savePath+fileName;
  24. try {
  25. inputStream = photo.getInputStream();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. try {
  30. byte[] bs = new byte[1024];
  31. int len;
  32. // 输出的文件流保存到本地文件
  33. File tempFile = new File(writePath);
  34. if (!tempFile.exists()) {
  35. tempFile.mkdirs();
  36. }
  37. os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);
  38. // 开始读取
  39. while ((len = inputStream.read(bs)) != -1) {
  40. os.write(bs, 0, len);
  41. }
  42. os.flush();
  43. userService.updateUserUserUrl(userId,userUrl);
  44. System.out.println(userUrl);
  45. data.put("userUrl", IpConfig.ip + userUrl);
  46. data.put("code", "success");
  47. data.put("msg","修改头像成功");
  48. return data;
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. data.put("code","error");
  52. data.put("msg","修改头像失败,请稍后重试!");
  53. return data;
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. data.put("code","error");
  57. data.put("msg","修改头像失败,请稍后重试!");
  58. return data;
  59. } finally {
  60. // 完毕,关闭所有链接
  61. try {
  62. os.close();
  63. inputStream.close();
  64. } catch (IOException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. }else {
  69. data.put("code","error");
  70. data.put("msg","上传头像格式需要为jpg、jpeg、png!");
  71. return data;
  72. }
  73. }

Mapper

  1. <!-- 修改用户头像 -->
  2. <update id="updateUserUserUrl">
  3. UPDATE user set user_url = #{userUrl}
  4. where user_id = #{userId}
  5. </update>

发表评论

表情:
评论列表 (有 0 条评论,1454人围观)

还没有评论,来说两句吧...

相关阅读

    相关 头像,背景图片详解

    头像,背景图片上传详解 上传头像和上传背景图片的思路都是一样的,所以这里选讲一下上传头像就行。 上传头像页面样式: ![在这里插入图片描述][watermark_