前言
上篇文章讲了前端如何上传文件,本篇文章主要讲解后端对于图片的接收和存储。
分析
(1)接收图片:controller参数采用MultipartFile
(2)存储图片:
- 将图片的二进制流直接存储在数据库,这样做肯定不太合理,会对数据库性能造成一定的影响。
- 将图片的地址即url存储在数据库,图片实体存储在服务器的文件夹里,当服务器开启时,可以通过url直接访问到图片。
实现
(1)后端如何处理参数
@PutMapping("/")
@Transactional
public ResultInfo modifyManage(@RequestParam(value = "manage") String tabs,
@RequestParam(value = "image",required=false) MultipartFile file,
HttpServletRequest req){
//前端传递json字符串,此时将此字符串转化为具体的实体类
TabCompanyLogin tab = JSON.parseObject(tabs,TabCompanyLogin.class);
//如果用户上传了新头像,我们需要做两个操作1.删除之前用户的头像;2.存储用户的新头像并生成新的url
if(file != null){
String path = manageMapper.selectManageByHrid(tab.getStaffId()).getUserface();
String filename = path.substring(path.lastIndexOf('/')+1);
FileUploadUtils.deleteFiles(new File(getUploadPath()+filename));
String url = "";
//存储file对象到指定路径
String newName = FileUploadUtils.uploadImage(file, getUploadPath());
if(newName !=null ){
//生成url
url = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() +"/smartControl/upload/"+ newName;
}
tab.setUserface(url);
}
//业务部分:对数据库tab实体类进行修改
int modifyUser = manageMapper.modifyManage(tab);
if(modifyUser == 1) {
return ResultUtil.success(tab,"修改成功");
}
else
return ResultUtil.error("修改失败");
}
public String getUploadPath(){
//获取运行jar目录 这样存储在本地或者部署在服务器上都可以使用
ApplicationHome h = new ApplicationHome(getClass());
File jarF = h.getSource();
String dirPath = jarF.getParentFile().toString()+"\\upload\\";
return dirPath;
}
工具类FileUploadUtils
import org.springframework.boot.system.ApplicationHome;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
public class FileUploadUtils {
public static String uploadImage(MultipartFile file, String dirPath){
File folder = new File(dirPath);
if (!folder.exists()) {
folder.mkdirs();
}
String oldName = file.getOriginalFilename();
String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));
try {
file.transferTo(new File(folder, newName));
} catch (IOException e) {
e.printStackTrace();
}
return newName;
}
public static void deleteFiles(File file){
if(file.exists())
file.delete();
}
}
总结
如上就是后端接收和存储头像的所有代码,如有疑问欢迎评论!