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);
                }
            }
        }
    }
相关推荐
带刺的坐椅1 小时前
用 ChatModel 构建 LLM 驱动的 Java 应用
java·ai·llm·solon·rag·chatmodel
赫媒派1 小时前
Gin 12年零破坏API,架构哲学如何练成?
后端·go·gin
fliter2 小时前
Arborium:把 tree-sitter 语法高亮打包成 Rust 文档生态的基础设施
后端
张三丰22 小时前
不会写代码的高管用Claude Code两天上线新程序,工程师接手后发现:一个Bug,让AI一天烧掉一个月服务器费!
后端
Ai拆代码的曹操2 小时前
从一条转账 SQL 到分布式事务:5 种方案的全方位对比与实战
后端
掘金小豆2 小时前
Spring 事务失效的 6 大场景,你踩过几个?
后端·spring·面试
杨运交3 小时前
[043][数据模块]基于 Spring Data JPA 的企业级数据访问层设计——实体、审计、状态与服务抽象
spring boot
im_lanny3 小时前
Agent = Model + Harness:决定 AI 智能体上限的,往往不是模型而是“装具”
后端
阿文和她的Key3 小时前
AI新词太多?把它们串成一条线就清楚了
后端
笨鸟飞不快3 小时前
当规则比代码跑得快:我对用 LiteFlow 编排信贷业务的一点思考
后端·设计