【坑】Tomcat重新部署,之前上传的图片资源无法访问 问题

  • A+
所属分类:系统文档


共计 4469 个字符,预计需要花费 12 分钟才能阅读完成。

在Java Web开发过程中,不免会遇到图片上传的场景,下面的是我的代码:

@PostMapping("/fileUpload")
    public List<Map<String, String>> fileUpload(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request) {
        // 原始文件名
        String fileName = file.getOriginalFilename();
        assert fileName != null;
        // 获取后缀名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        // 上传后的临时存储的路径
        String filePath = request.getSession().getServletContext().getRealPath("blogImages");
        // 生成一个新文件名
        fileName = UUID.randomUUID() + suffixName;
        // 每一天生成生成日期目录,方便管理
        String fileAdd = new SimpleDateFormat("yyyyMMdd").format(new Date());
        //获取文件夹路径
        filePath = filePath + File.separator + fileAdd + File.separator;
        log.info("path:{}", filePath);
        File dest = new File(filePath + "/" + fileName);
        // 先判断文件是否存在
        if (!dest.getParentFile().exists()) {
            boolean mkdirs = dest.getParentFile().mkdirs();
        }
        String src = dest.getAbsolutePath();
        //根据自己系统的resource 目录所在位置进行自行配置 F:\IdeaProjects\blog\src\main\resources\static\images\blogImages
        String destDir = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "static" + File.separator + "images" + File.separator + "blogImages" + File.separator + fileAdd + File.separator;
        File destFile = new File(destDir + fileName);
        try {
            file.transferTo(dest);
            if (!destFile.getParentFile().exists()) {
                boolean mkdirs = dest.getParentFile().mkdirs();
            }
            copyFile(src, destDir, fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String imageSrc = "/static/blogImages/" + fileAdd + "/" + fileName;
        log.info("imageSrc:{}", imageSrc);
        List<Map<String, String>> result = new ArrayList<>();
        Map<String, String> map = new HashMap<>();
        map.put("imageSrcValue", prefixRequestUrl + imageSrc);
        map.put("imageSrc", prefixRequestUrl + imageSrc);
        result.add(map);
        return result;
    }

1.第一个问题是这个虚拟路径,在tomcat上部署的项目获取到的是webapps下面

// 上传后的临时存储的路径
        String filePath = request.getSession().getServletContext().getRealPath("blogImages");

2.tomcat在项目重新部署是会先将webapps下面全部清空,然后解压war包重新启动,此时之前的图片资源就会丢失
重新部署之前:

【坑】Tomcat重新部署,之前上传的图片资源无法访问 问题
我的图片资源文件夹blogImages是存在的;
重新部署之后:

【坑】Tomcat重新部署,之前上传的图片资源无法访问 问题
我的图片资源文件夹blogImages不存在了;

解决方案

我的代码中增加了逻辑,在图片上传临时路径后,有一处新的copy方法

/**
     * 文件复制
     *
     * @param src
     * @param destDir
     * @param fileName
     * @throws IOException
     */
    public void copyFile(String src, String destDir, String fileName) throws IOException {
        FileInputStream in = new FileInputStream(src);
        File fileDir = new File(destDir);
        if (!fileDir.isDirectory()) {
            fileDir.mkdirs();
        }
        File file = new File(fileDir, fileName);

        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream out = new FileOutputStream(file);
        int c;
        byte buffer[] = new byte[1024];
        while ((c = in.read(buffer)) != -1) {
            for (int i = 0; i < c; i++) {
                out.write(buffer[i]);
            }

        }
        in.close();
        out.close();
    }

把上传的图片重新拷贝一份到服务器本地磁盘路径上:

//根据自己系统的resource 目录所在位置进行自行配置 F:\IdeaProjects\blog\src\main\resources\static\images\blogImages
        String destDir = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "static" + File.separator + "images" + File.separator + "blogImages" + File.separator + fileAdd + File.separator;
        File destFile = new File(destDir + fileName);

运行之后在我的tomcat目录下面会出现以下我配置的路径(可以视具体情况配置):

root@ab9d09eef062:/usr/local/tomcat/src/main/resources/static/images/blogImages# pwd
# 如下就是部署之后存放图片资源的磁盘路径(后面配置会用到)
/usr/local/tomcat/src/main/resources/static/images/blogImages
root@ab9d09eef062:/usr/local/tomcat/src/main/resources/static/images/blogImages#

找到tomcat配置目录

root@ab9d09eef062:/usr/local/tomcat# cd conf/
root@ab9d09eef062:/usr/local/tomcat/conf# ls -l
total 236
drwxr-s--- 3 root root   4096 Dec 23 00:06 Catalina
-rw-r--r-- 1 root root  13132 Dec 23 00:04 catalina.policy
-rw-r--r-- 1 root root   7468 Dec 23 00:04 catalina.properties
-rw-r--r-- 1 root root   1493 Jan  1 11:24 context.xml
-rw-r--r-- 1 root root   1172 Dec 23 00:04 jaspic-providers.xml
-rw-r--r-- 1 root root   2365 Dec 23 00:04 jaspic-providers.xsd
-rw-r--r-- 1 root root   2971 Dec 23 00:05 logging.properties
-rw-r--r-- 1 root root   7896 Jan  2 17:48 server.xml
-rw-r--r-- 1 root root   2208 Dec 23 00:04 tomcat-users.xml
-rw-r--r-- 1 root root   2617 Dec 23 00:04 tomcat-users.xsd
-rw-r--r-- 1 root root 177096 Dec 23 00:04 web.xml

修改server.xml文件

root@ab9d09eef062:/usr/local/tomcat/conf# vim server.xml
<!--找到<Host>标签 -->
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
<!--增加<Context>标签 配置如下:docBase服务器上存储图片的具体路径(上文有提到)path浏览器访问图片的路径,reloadable可不配置默认即可 我的图片资源目录即为blogImages -->
       <Context docBase="/usr/local/tomcat/src/main/resources/static/images/blogImages" path="/myBlog/static/blogImages" reloadable="true"/>
        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

大功告成,重启tomcat即可

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: