后端实现头像上传
说明
主体思路,前端写一个input标签,将input标签隐藏,将上传的图片传给后端,后端接收后,保存在本地,将文件的地址存储到数据库,前端获取到数据库的图片路径,再加载图片。
代码
// controller层,因为是文件,用MultipartFile接收
@PostMapping(value = "/update_portrait")
public Object updatePortrait(@RequestParam("file") MultipartFile file, String userId) throws IOException {
return mService.updatePortrait(file,userId);
}
//service层
RestResult updatePortrait(MultipartFile file,String userId) throws IOException;
//serciceImp层
@Override
public RestResult updatePortrait(MultipartFile file, String userId) throws IOException {
System.out.println("##################上传开始");
//获取文件名
String originalFilename = file.getOriginalFilename();
//获取后缀,lastIndexOf可返回指定字符串值最后出现的位置,对大小写敏感,没有值时返回-1。
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
//保存自定义的文件名。UUID.randomUUID()直接生成的ID中存在"_",如果不需要可用replace()方法去掉。
String dFileName = UUID.randomUUID() + substring;
//保存路径
//springboot 默认情况下只能加载 resource文件夹下静态资源文件
//生成保存文件,
File uploadFile = new File("F:\\picture\\" + dFileName);
System.out.println("##########uploadFile=" + uploadFile);
//将上传文件保存到路径
try {
//使用绝对路径且文件夹必须已经存在
file.transferTo(uploadFile);
} catch (IOException e) {
e.printStackTrace();
}
List<UserEntity> tableUsers = userEntityRepository.findByUid(userId);
// 判断用户是否重复
if (tableUsers.size() <= 0) {
return RestResult.error(ERROR_SERVER_ERROR);
}
UserEntity userEntity = tableUsers.get(0);
userEntity.setPortrait(net_portrait + dFileName);
userEntityRepository.save(userEntity);
System.out.println("############结束上传!!!!");
return RestResult.ok("上传成功!");
}
同事项目写的文件上传代码,借鉴一下
@Override
pubulic void uploadFile(MultipartFile resoucefile){
try{
String originalFilename = resoucefile.getOriginalFilename();
log.info("file name is :"+originalFilename );
//这个uploadURL是在yml文件定义的绝对路径,是提前写的,是D:\\picture\\。为了直观我直接用字符串定义了。
String uploadURL= "D:\\picture\\";
File targetFile = new File(uploadURL);
if(!targetFile .exists()){
targetFile.mkdir();
}
FileOutputStream out = new FileOutputStream(url);
out.write(resoucefile.getBytes());
out.flush();
out.close();
}catch(Exception e){
e.printStackTrace();
}
}