`先看昨天的问题: 今天写springboot项目时,我在写这项功能时遇到了一个bug,我写的图片上传功能选择图片后会将该图片给命名为headpic.(他们自带的后缀名),每次重新保存信息的时候一位上传到保存地址一样,我保存文件的命名又一样,这样就会默认替换原来的文件,因为文件名一样,不过图片是换了的,但是换了图片后,也就是重新上传图片后,就会有一个奇怪的bug这里是引用!
再次保存选择后的图片后,发现我选择的图片已经替换掉了原来的图片了,在系统的绝对路径中,就像文件夹显示的,文件夹里只有一个图片,但是浏览器按照地址加载后,因为地址和文件名都没有改变,浏览器加载出来的图片竟然没有改变,而绝对路径和项目下的映射文件夹都没有加载出来的这一张图片,难道是浏览器没有检测到img标签的src有改变,因此加载的图片是缓存?这是我的猜测,明天再做测试检验。洗洗睡了,都要十一点了。。
第二天的解决过程:按照我昨天的思路,我就打算直接在图片重名命名中加了这样的代码:
// 更改为固定格式的文件名,时间+“headpic.”+后缀名 Date now=new Date(); String headpicname = "headpic_"+String.valueOf(now.getTime())+"." + suffix; headpic.transferTo(new File(path + File.separator + headpicname));
之前我写的保存文件的方法都写在了controller里面,这次我写在了service,很多controller都可以调用它,感觉这样舒服多了,减少了代码量,提高了可读性,看来我也在像高手爬啊。结果问题就解决了,
这样每次改变图片浏览器都会检测到img控件的src发生了改变,就会显示改变了。下面是我写的方法,代码很多就随便贴一点出来了,在这里插入代码片
//此方法用来将图片上传到想要保存的地址
public String recruiterSavePicture(String username, String pictureType,String suffix,MultipartFile headpic)throws ServletException, IOException {
//上面的参数分别是用户名,想要删除的图片包含的字段,文件后缀名,图片文件,文件的校验不在这里,在传参数之前一定要校验
String path = "E:\\workplace\\j2ee\\studeySystem\\src\\main\\resources\\static\\userFile\\recruiters\\"+ username;
//保存的地址,需要在springboot的配置里声明映射关系,浏览器才能使用
File file = new File(path);
// 判断上传文件的保存目录是否存在
if (!file.exists() && !file.isDirectory()) {
System.out.println(path + "目录不存在,需要创建");
// 创建目录
file.mkdir();
} // 已存文件夹就删除想删除的文件
else {
for (File fil : file.listFiles()) {
String filname = fil.getName();
if (filname.contains(pictureType)) {//如果文件名包含我要删除的文件的一部分,例如我想删除包含“headpic”字段的文件。
deleteFile(fil);//那就删除它
}
}
}
// 更改为固定格式的文件名,时间+“headpic.”+后缀名
Date now=new Date();
String headpicname = "headpic_"+String.valueOf(now.getTime())+"." + suffix;
headpic.transferTo(new File(path + File.separator + headpicname));
return "/userFile/recruiters/"+username+"/"+headpicname;
}