SpringBoot实现上传头像(查看头像)

SpringBoot实现上传头像给功能和查看头像功能

文章目录

目录

文章目录

1.上传头像

1.这里的AppConfig记得定义一下

2.引入AppConfig

3.上传文件代码

2.获取头像

1.实现readFile方法


1.上传头像

  1. 首先我的代码中在application.properties中设置了上传文件的根目录
复制代码
project.folder=F:/a-xxxxxxxxxxxxxxxxx/java/yunxipan_java/easypan

通过AppConfig获取到上传文件根目录

1.这里的AppConfig记得定义一下

java 复制代码
@Component("appConfig")
public class AppConfig {
 //获取application.properties定义的根目录
    @Value("${project.folder:}")
    private String projectFolder;
    public String getProjectFolder() {
        return projectFolder;
    }

}

2.引入AppConfig

java 复制代码
@Resource
private AppConfig appConfig;

3.上传文件代码

java 复制代码
@RequestMapping("/updateUserAvatar")
	public ResponseVO updateUserAvatar(HttpSession session, MultipartFile avatar){
		SessionWebUserDto webUserDto = getUserInfoFromSession(session);
		String baseFolder = appConfig.getProjectFolder()+Constants.FILE_FOLDER_FILE;
		File targetFileFolder = new File(baseFolder+Constants.FILE_FOLDER_AVATAR_NAME);
		File targetFile = new File(targetFileFolder.getPath()+"/"+webUserDto.getUserId()+Constants.AVATAR_SUFFIX);
		if(!targetFileFolder.exists()){
			targetFileFolder.mkdirs();
		}
		try {
			avatar.transferTo(targetFile);
		} catch (Exception e) {
			logger.error("上传头像失败",e);
		}
		return getSuccessResponseVO(null);
	}
//我这边用到的是Session来记录用户登录信息的,当然你也可以使用别的方式,这里的大概内容是这样,(别的方式的话)自行实现一下就好,逻辑也差不多

2.获取头像

java 复制代码
/**
	 * 获取用户头像
	 * @param session
	 * @param userId
	 * @return
	 */
	@RequestMapping("/getAvatar/{userId}")
	@GlobalInterceptor(checkParams = true)
	public void getAvatar(HttpServletResponse response,HttpSession session, @VerifyParam(required = true) @PathVariable("userId") String userId){
		//定义头像存放的根目录
		String avatarFolderName = Constants.FILE_FOLDER_FILE + Constants.FILE_FOLDER_AVATAR_NAME;
		//如果这个目录不存在的话创建这个目录
		File folder = new File(appConfig.getProjectFolder()+avatarFolderName);
		if(!folder.exists()){
			folder.mkdirs();
		}
		//定义头像存放的具体位置
		String avatarPath = appConfig.getProjectFolder()+avatarFolderName+userId+Constants.AVATAR_SUFFIX;
		File file = new File(avatarPath);
		//如果头像不存在的话,输出一个默认的头像
		if(!file.exists()){
			//如果说默认头像不存在的话
			if(!new File(appConfig.getProjectFolder() + avatarFolderName+Constants.AVATAR_DEFAULT).exists()){
				printNoDefaultImage(response);
			}
			avatarPath = appConfig.getProjectFolder()+avatarFolderName+Constants.AVATAR_DEFAULT;
			response.setContentType("image/jpg");
			readFile(response,avatarPath);
		}
	}

1.实现readFile方法

java 复制代码
//读文件,返回一个文件流
    protected void readFile(HttpServletResponse response,String filePath){
        //如果文件路径不合法,则直接返回
        if(!StringTools.pathIsOk(filePath)){
            return;
        }
        OutputStream out = null;
        FileInputStream in = null;
        try {
            File file = new File(filePath);
            // 如果文件不存在,则直接返回
            if (!file.exists()) {
                return;
            }
            in = new FileInputStream(file);  // 打开文件输入流
            byte[] byteData = new byte[1024];  // 定义缓冲区
            out = response.getOutputStream();  // 获取响应输出流
            int len = 0;
            // 读取文件并写入响应输出流
            while ((len = in.read(byteData)) != -1) {
                out.write(byteData, 0, len);
            }
            out.flush();
        } catch (Exception e) {
            logger.error("读取文件异常", e);
        } finally {
            //关闭输出流
            if(out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    logger.error("IO异常",e);
                }
            }
            //关闭输入流
            if(in != null ){
                try{
                    in.close();
                }catch (IOException e){
                    logger.error("IO异常", e);
                }
            }
        }
    }
相关推荐
Rust研习社16 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒17 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
CaffeinePro18 小时前
Pydantic深度使用:数据校验、枚举、ORM映射
后端·fastapi
Chenyiax18 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH18 小时前
Koa和Express的区别
后端
MariaH18 小时前
Koa框架的使用
后端
luckdewei19 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某21 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy21 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom21 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github