SpringBoot实现上传头像给功能和查看头像功能
文章目录
目录
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);
}
}
}
}