用户上传头像流程
1.图片上传至服务器
@PostMapping("upload")
public String uploadHeader(MultipartFile headerImage, Model model) {
//判断图片是否为空
if (headerImage == null) {
model.addAttribute("error", "请先上传图片!");
return "/site/setting";
}
//判断图片是否合法
String fileName = headerImage.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf("."));
if (!suffix.equals(".png") && !suffix.equals(".jpg") && !suffix.equals(".jpeg")) {
model.addAttribute("error", "请上传png/jpg/jpeg格式的图片文件!");
return "/site/setting";
}
//生成随机文件名
fileName = CommunityUtil.generateUUID() + suffix;
//确定文件存放路径
File dest = new File(headerPath + "/" + fileName);
//存储文件
try {
headerImage.transferTo(dest);
} catch (IOException e) {
logger.error("文件存储失败" + e.getMessage());
throw new RuntimeException("文件存储失败,服务器异常", e);
}
//更新hostHoler中的url
User user = hostHolder.getUser();
/*
domain:服务器地址
*/
String headerUrl = domain + contextPath + "/user/header/" + fileName;
//更新数据库中的url
userService.updateUserHeader(user.getId(), headerUrl);
return "redirect:/index";
}
MultipartFile :
- getName() 返回参数的名称
- getOriginalFilename()获取源文件的昵称
- getContentType() 返回文件的内容类型
- isEmpty() 判断是否为空,或者上传的文件是否有内容
- getSize() 返回文件大小 以字节为单位
- getBytes() 将文件内容转化成一个byte[] 返回
- getInputStream() 返回InputStream读取文件的内容
- transferTo(File dest) 用来把 MultipartFile 转换换成 File
2.解析url
@GetMapping("/header/{fileName}")
public void getHeader(@PathVariable("fileName") String fileName, HttpServletResponse response) {
//找到服务器存放路径
fileName = headerPath + "/" + fileName;
//解析文件后缀
String suffix = fileName.substring(fileName.lastIndexOf("."));
//响应的格式
response.setContentType("image/" + suffix);
try (FileInputStream stream = new FileInputStream(fileName);
ServletOutputStream os = response.getOutputStream();) {
byte[] buffer = new byte[1024];
int b = 0;
while ((b = stream.read(buffer)) != -1) {
os.write(buffer, 0, b);
}
} catch (IOException e) {
logger.error("读取头像失败", e);
}
}
从url中解析出图片在服务器中存储的位置,将其转化为字节流,创建buffer(缓冲区)将二进制图片通过response上传至客户端(-1时代表结束)。
read:Reads up to b.length bytes of data from this input stream into an array of bytes.
write:Writes len bytes from the specified byte array starting at offset off to this output stream.
字节流和字符流
- 字节流:
– 将文件转化为二进制字节进行输入输出(图片,声音,文件等在硬盘上存储的文件)。 - 字符流
– 对缓冲区进行操作,一般是用来对字符,字符串等进行传输。
点击看gitee源码!