解决idea eclipse java项目重启后已上传文件/图片丢失问题

本文探讨了在使用Tomcat服务器时,图片上传后重启导致图片丢失的原因。问题在于图片被保存在了Tomcat的webapps目录下,而重新部署时这些文件会被删除。解决方案是将图片保存在Eclipse工作空间的目录,以便在重新部署时同步到服务器。此外,文章还提供了在调试阶段的临时解决办法以及正式发布时的路径调整建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有些人问,为什么在涉及到图片(包括文件)上传的时候,当重启tomcat服务器后之前已经上传过的图片(或文件)丢失了?

 

说起这个问题,我们需要了解tomcat的一些原理。一般的功能需求是我们需要将图片上传,并且需要将图片通过URL回显给JSP页面。那为什么在调试的时候,上传到tomcat的图片再重新部署之后就消失了。

首先说一下,为什么要将图片存放到tomcat服务器或者更直白点说是web工程目录下的原因:

项目中对于图片的处理在于用户上传比如自己的头像,上传后再查看时,就直接根据服务器的URL指定图片的位置去查看图片,通俗点就是jsp页面中的标签的src属性的路径就直接指向服务器该图片存放的位置。鉴于这一点,所以将图片文件存放在了tomcat中,而不放在服务器磁盘文件系统中,这样前端JSP就可以直接通过URL访问到图片资源。

普遍遇到的问题:发现上传的图片在改动eclipse上的代码的时候,也就是重新部署后,tomcat下的webapps中的工程目录下的图片全部没有了,很奇怪,其实原因如下:

我们在Java代码中上传图片时,图片的路径是通过代码

request.getSession().getServletContext().getRealPath("/img")
来获取路径的,而这句代码返回的路径是tomcat中webapps目录下的工程路径,图片就直接保存到了tomcat中。

当我们重新发布工程的时候,tomcat其实是先将原来的工程删掉,然后再将改动过的新的工程放上去。而改动过的新的工程是来自与我们eclipse的工作空间中的工程,这就也难怪了,因为我们是把图片直接上传到的tomcat服务器下,而不是放到工作空间的工程目录下,自然重新部署后图片就没了。

@RequestMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
   if (file.isEmpty()) {
      throw new EIException("上传文件不能为空");
   }
   String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
   File upload = new File("D:/work/");
   if(!upload.exists()) {
      upload.mkdirs();
   }
   String fileName = new Date().getTime()+"."+fileExt;
   File dest = new File(upload+"/"+fileName);

   file.transferTo(dest);
   if(StringUtils.isNotBlank(type) && type.equals("1")) {
      ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
      if(configEntity==null) {
         configEntity = new ConfigEntity();
         configEntity.setName("faceFile");
         configEntity.setValue(fileName);
      } else {
         configEntity.setValue(fileName);
      }
      configService.insertOrUpdate(configEntity);
   }
   return R.ok().put("file", fileName);
}

registry.addResourceHandler("/upload/**").addResourceLocations("file:D:/work/");

 

static-locations: classpath:/testStatic/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

 

解决办法:
归根到底的原因就是因为

request.getSession().getServletContext().getRealPath("/img")
这句代码搞的鬼,所以在调试时,我们在Java代码中保存上传的图片位置时将图片的保存路径应该保存在eclipse工作空间的目录下,如:

D:\eclipse-mars\filkesss\OnlineMovie\WebContent\videothumbnail\";
这样,图片在上传到该工作空间后,因为项目发生了改变,eclipse会再次发布工程,这时图片便会同步到tomcat服务器中,这时,我们前端jsp页面也就可以通过URL定位到图片了。

注意的地方:
归根到底这些问题其实还是因为我们是在调试的工程中,发布后肯定是不会出现这些问题的。因为你想想我们的web工程一般是发布到Linux下,发布了之后你的tomcat服务器只有关闭和打开,而不会对工程重新部署,自然也就不会出现这些问题。然后这也同时出现了另外一个问题,就是我们的web系统是在Linux下,也不会有eclipse环境,那也就更不用谈什么工作空间了,所以如果在代码中String path =  “E:\program\eclipse project\Server\WebContent\img”;这么写系统肯定会报错咯。所以最终来说,改成这样也只是权宜之计,方便我们在调试的时候用的,到项目正式发布的时候需要我们再将路径改成request.getSession().getServletContext().getRealPath(“/img”)的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆包程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值