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);
                }
            }
        }
    }
相关推荐
怒放吧德德2 分钟前
Python3基础:基础实战巩固,从“会用”到“活用”
后端·python
Sylvia-girl6 分钟前
IO流~~
java·开发语言
冰暮流星18 分钟前
javascript之数组
java·前端·javascript
Re.不晚22 分钟前
JAVA进阶之路——无奖问答挑战3
java·开发语言
不倒翁玩偶40 分钟前
IDEA导入新的SpringBoot项目没有启动按钮
java·spring boot·intellij-idea
小小小米粒1 小时前
Maven Tools
java
苏三说技术1 小时前
xxl-job 和 elastic-job,哪个更好?
后端
三小河1 小时前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
kali-Myon1 小时前
2025春秋杯网络安全联赛冬季赛-day1
java·sql·安全·web安全·ai·php·web
我是咸鱼不闲呀1 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划