个人头像手动上传的后端代码展示(基于Springboot)

一些Springboot的小实战 专栏收录该内容
3 篇文章 0 订阅

个人头像手动上传(基于Springboot的后端代码展示)

场景一:一般来说,对于微信小程序,很多时候登录的场景都是,“是否同意上传微信头像”;“获取您的用户信息”。然后我们通常都是同意的嘛。然后就会你的头像就会出现在页面固定的位置。可以说是很方便,因为微信开发平台是开放相应的API给我们的,我们可以通过第三方(微信)实现用户在自己后台登录。

场景二:但同时也存在很多个人头像手动上传的场景,比如快手平台,这样用户就可以根据自己的喜好上传和更换自己喜欢的图片,也可以不上传图片,更加地人性化。

package com.imooc.controller;

import com.imooc.pojo.Users;
import com.imooc.service.UserService;
import com.imooc.utils.IMoocJSONResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

@RestController
@Api(value="用户相关业务的接口", tags= {"用户相关业务的controller"})
@RequestMapping("/user")
public class UserController extends BasicController {

    @Autowired
    private UserService userService;

    @ApiOperation(value = "用户上传头像", notes = "用户上传头像的接口")
    @ApiImplicitParam(name = "userId", value = "用户id", required = true,
            dataType = "String", paramType = "query")
    @PostMapping("/uploadFace")
    //登录后通过userId上传头像
    public IMoocJSONResult uploadFace(String userId,
                                      @RequestParam("file") MultipartFile[] files) throws Exception {

        if (StringUtils.isBlank(userId)) {
            return IMoocJSONResult.errorMsg("用户id不能为空...");
        }

        // 文件保存的命名空间
        String fileSpace = "C:/videos_dev";
        // 保存到数据库中的相对路径
        String uploadPathDB = "/" + userId + "/face";

        FileOutputStream fileOutputStream = null;
        InputStream inputStream = null;
        try {
            if (files != null && files.length > 0) { //有头像上传

                /**
                 * 上传头像默认是一个文件(下面直接取第[0]个),如果是多个就使用for循环以下的整个步骤
                 */
                String fileName = files[0].getOriginalFilename(); //获取文件的原名称
                if (StringUtils.isNotBlank(fileName)) {
                    // 文件上传的最终保存路径
                    //例:C:/imooc_videos_dev/10010/face/*.png
                    String finalFacePath = fileSpace + uploadPathDB + "/" + fileName;
                    // 设置数据库保存的路径
                    //例:/10010/face/*.png
                    uploadPathDB += ("/" + fileName);

                    //打开文件
                    File outFile = new File(finalFacePath);
                    //getParentFile()获取抽象路径的父目录的抽象路径名
                    if (outFile.getParentFile() != null || !outFile.getParentFile().isDirectory()) {
                        // 创建父文件夹
                        outFile.getParentFile().mkdirs(); //outFile.mkdirs() 就是*.png也变成了目录
                    }

                    fileOutputStream = new FileOutputStream(outFile);
                    inputStream = files[0].getInputStream(); //获取文件流
                    IOUtils.copy(inputStream, fileOutputStream);
                }

            } else {
                return IMoocJSONResult.errorMsg("上传出错...");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return IMoocJSONResult.errorMsg("上传出错...");
        } finally {
            if (fileOutputStream != null) {
                fileOutputStream.flush();
                fileOutputStream.close();
            }
        }
        //下面四行代码的作用更新userId和图片的相对路径
        Users user = new Users();
        user.setId(userId);
        user.setFaceImage(uploadPathDB);
        userService.updateUserInfo(user);
        
        //返回相对路径,前端通过相对路径+静态资源映射即可获得图片,最后显示出来
        return IMoocJSONResult.ok(uploadPathDB);
    }
  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值