在javaweb项目开发中,图片上传是个比较常见的场景。一般都是在项目路径下建个文件夹,然后上传到该文件夹下;这样这个图片就可以和静态资源一样被直接访问。这样的好处就是访问这图片特别方便;缺点是重新部署时要手动把图片备份,不然图片就丢失了。

        今天通过在网上查阅一些资料,找到了如下2个方案:
        (1)配置tomcat虚拟目录
      • 该方案的好处是虚拟目录下的文件也可以类似于静态资源一样这样访问
      • 美中不足的是上传图片还需要上传到虚拟目录的绝对路径,在网上没看到怎么获取虚拟目录的绝对路径的方法;个人想到的解决方案就是配置一个properties文件,里面放绝对路径。

更多相关内容可以在网上查阅。。参考:http://blog.csdn.net/l1028386804/article/details/52389722


        (2)通过linux的软连接实现
      • 该方案的好处就是可以和类似静态文件一样访问,上传就直接上传到项目根目录下的文件夹即可。和文章开头说的那种方案在代码上来说是一样的。
      • 缺点是需用通过linux命令对上面项目根目录的上传文件夹做软连接,连接完之后上传的文件其实是上传到了软连接的文件夹去了。
      • 还有个问题是需要配置tomcat支持软连接

综合上面2种情况,我选择采用软连接的方式,下面谈谈linux软连接。

一、软连接介绍

        软连接命令:
ln -s 源文件 目标文件 
 
1
ln -s 源文件 目标文件 
        具体介绍可参考:http://www.cnblogs.com/crazylqy/p/5821105.html

二、实际案例

        (1)代码中,我们把文件上传到项目路径(webRoot或者webapp)的下的images/ 文件夹中;这个上传怎么实现,不介绍。
        (2)linux中的处理
    • 在linux中建立一个名为images的文件夹。(这个文件夹名字要和你准备软连接的文件夹名字一样,这个文件夹的位置随便在那都可以,但是一般都在tomcat的外面。)

    • 进入到tomcat下的部署好的项目路径下,创建软连接。源文件夹是上面创建的该文件夹,目标文件夹是后面我们上传的文件夹。

建立成功后就可以看到images文件夹下有个箭头,用图形界面看其实就是个快捷方式。

                
 
    • 建立软连接后,可以测试上传文件,会发现文件上传后跑到tomcat外面的文件夹里面去了。但是用访问静态文件的方式现在还是访问不到,会报404。原因是tomcat默认不支持软连接,需要在conf/context.xml中开启。配置方法如下:

tomcat5、6、7版本:

                        <Context allowLinking="true" />

          tomcat8、9版本:

<Context> <Resources allowLinking="true" /> </Context>

         更多配置参考:http://www.cnblogs.com/wuxun1997/p/6769971.html

    • 配置完后,就大功告成了。

更多软连接的案例可参考:http://blog.csdn.net/ggmmqq/article/details/8253570  

http://www.cnblogs.com/wuxun1997/p/6769971.html

三、软连接的注意事项

(1)软连接的删除需要特别注意,具体可参考

http://www.cnblogs.com/cartsp/p/6437046.html

http://blog.csdn.net/zhenwenxian/article/details/16369767

(2)笔者发现eclipse的重新部署还是会把软连接的源目录下的文件删除,这个是个很奇怪的地方。不过运维人员重新部署肯定不是用eclipse的。所以不用担心。

(3)重新部署项目后,软连接需要重新建立


后续还有一篇介绍linux软连接的文章,推荐阅读。


                 

linux下通过软连接实现访问项目路径外面的资源的更多相关文章

  1. Linux下SVN创建新的项目

    Linux下SVN创建新的项目   Linux环境下的SVN创建新的项目 一.前置条件: 1)有安装了linux系统的服务器,123.*.*.29 2)服务器上安装了svn,本人服务器的svn的数据安 ...

  2. Windows 与 Linux下关于端口不能访问的问题

    自己写的一个HTTP文件服务器,在端口 50000上监听HTTP连接请求,在Eclipse里面将程序正常地启动之后,能够在自己的机器上(Eclipse启动该程序的机器上)访问 50000端口,即Fil ...

  3. linux下使用SVN上传项目

    linux下使用SVN上传项目 摘自:https://blog.csdn.net/puppet_/article/details/78259591 2017年10月17日 13:51:33 puppe ...

  4. Linux 下指定端口开放访问权限

    Linux 下指定端口开放访问权限 作者:Grey 原文地址: 博客园:Linux 下指定端口开放访问权限 CSDN:Linux 下指定端口开放访问权限 环境 CentOS 系和 Debian 系的防 ...

  5. linux下使用软连接之案例二

           在笔者的上一篇文章介绍过怎么通过linux的软连接在不修改上传代码的情况下,将上传到项目路径下的图片改为上传到项目外面,防止重新部署后图片被删除了.同时还可以直接通过类似访问静态资源的方 ...

  6. Linux下tomcat的安装与项目部署

    最近在linux下安装了jdk,为了圆我以前的心愿,把tomcat也安装了,顺便部署个项目,也算是小又成就感 废话不说了,直接上过程 一.下载安装对应的jdk,并配置Java环境. 有关jdk的安装请 ...

  7. linux下c/c++方式访问curl的帮助手册

    自:http://blog.chinaunix.net/u1/47395/showart_1768832.html 有个业务需求需要通过curl 代理的方式来访问外网 百度了一把,测试可以正常使用.记 ...

  8. linux 下添加库的加载路径的方式

    linux 下有两种添加加载库路径的方式: 1.修改环境变量: export LD_LIBRARY_PATH=path_name 2.修改配置文件 修改 /etc/ld.so.conf 的内容在最后添 ...

  9. Linux下的软连接和硬链接

    由于教学上的原因,需要下载Android源码,后来使用repo时,系统提示需要python2,我的系统中是两个都有的,但是默认是python3,无法下载,通过创建了个链接搞定,下面就来说说linux下 ...

随机推荐

  1. 8.2,常用模块介绍:sys,os,time,random

    sys: 介绍:主要包含涉及python编译器与系统交互的函数. 常用函数: import sys print(sys.argv)#本文件名,已经运行该程序时的参数 #[如在命令窗口中python3 ...

  2. 构建第一个SpringBoot工程

    学习和使用 SpringBoot 有一段时间了,现在开始陆陆续续会总结归纳 SpringBoot 学习中遇到的相关知识点. SpringBoot 设计目的是用来简化新Spring应用的初始搭建以及开发 ...

  3. [Spark Core] Spark 在 IDEA 下编程

    0. 说明 Spark 在 IDEA 下使用 Scala  & Spark 在 IDEA 下使用 Java 编写 WordCount 程序 1. 准备 在项目中新建模块,为模块添加 Maven ...

  4. trait代码复用

    在面对对象编程中我们经常通过继承来解决部分代码多次出现的问题 php支持单继承,有时候由于不相关联的两个类的方法相同我们需要进行继承操作, trait可以实现不继承的情况下复用代码 trait的使用类 ...

  5. MySQL一个延迟案例

    突然接到报警显示MySQL主从之间延迟过大,随后尽快到集群上面看看,进行排查. 首先我们查看延迟是由什么造成的,排查一遍过后发现不是网卡和从库机器的负载,那就要从其他地方来排除了 查看binlog日志 ...

  6. October 15th 2017 Week 42nd Sunday

    Excellence is a continuous process and not an accident. 卓越是一个持续的过程而不是一个偶然事件. It is said that ten tho ...

  7. [HZNOI #koishi] Magic

    [HZNOI #514] Magic 题意 给定一个 \(n\) 个点 \(m\) 条边的有向图, 每个点有两个权值 \(a_i\) 和 \(b_i\), 可以以 \(b_i\) 的花费把第 \(i\ ...

  8. .Net Core Api 跨域配置

    .Net Core 和Asp.Net 不同,不需要再去引用其他的跨域组件.创建项目时,就有了. 让接口实现跨域,需要配置两个地方. 一.Startup.cs 这里需要配置两个地方 public voi ...

  9. mac brew安装mysql

    mac不自带mysql,这里需要重新安装,方法依然很简单 brew install mysql unset TMPDIR mysql_install_db --verbose --user=`whoa ...

  10. 数据库事务总结(一)-ACID

    概述 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将 ...