【问题标题】:How to config Tomcat to serve images from an external folder outside webapps? [duplicate]如何配置 Tomcat 以提供来自 webapps 外部文件夹的图像? [复制]
【发布时间】:2010-09-29 21:07:44
【问题描述】:

如何使用 Tomcat 从 webapps 外部的公共文件夹中提供图像文件?我不想在不同的端口上使用第二个 Apache 文件服务器,因为图像文件是同一个应用程序的一部分。而且我不想创建指向 webapps 内公共文件夹的符号链接,因为我的应用程序被部署为一个 war 文件...... /p>

【问题讨论】:

标签: tomcat


【解决方案1】:

这非常简单直接,可以在 tomcat 中从外部 webapps 文件夹中提供静态内容。

只需编辑 $CATALINA_HOME/config/server.xml 下的 server.xml 如下,然后重启 tomcat。

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        **<Context docBase="C:\Ankur\testFiles"  path="/companyLogo" />**

       <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>

在具有两个属性 docBase 和 path 的宿主元素内添加上下文元素。

1) docBase:代表硬盘目录 2) 路径: 表示您要在其上提供静态内容的 uri。

例如:如果您在 C:\Ankur\testFiles 目录中有 7.png,那么您可以访问 7.png 文件,如下所示:

http://localhost:8081/companyLogo/7.png

更多详情,请查看blog

【讨论】:

    【解决方案2】:

    我就是这样做的,对我来说效果很好。 (在 Tomcat 7.x 上完成)

    &lt;context&gt; 添加到tomcat/conf/server.xml 文件中。

    Windows 示例:

    <Context docBase="c:\Documents and Settings\The User\images" path="/project/images" />
    

    Linux 示例:

    <Context docBase="/var/project/images" path="/project/images" />
    

    像这样(在上下文中):

    <Server port="8025" shutdown="SHUTDOWN">
     ...
      <Service name="Catalina">
        ...
        <Engine defaultHost="localhost" name="Catalina">
         ...
         <Host appBase="webapps"
          autoDeploy="false" name="localhost" unpackWARs="true"
          xmlNamespaceAware="false" xmlValidation="false">
          ...
          <!--MAGIC LINE GOES HERE-->
           <Context  docBase="/var/project/images" path="/project/images" />
    
          </Host>
        </Engine>
      </Service>
    </Server>
    

    这样,你应该可以在下面找到文件(例如/var/project/images/NameOfImage.jpg):

    http://localhost:8080/project/images/NameOfImage.jpg 
    

    【讨论】:

    • 也适用于 tomcat 6.0.37!!!
    • 它不适合我
    • 记得确保你的 标签内。
    • 在 apache tomcat 8.0.27 上运行良好。问候!
    • 这个应该被标记为答案恕我直言
    【解决方案3】:

    在 Tomcat 7 中,您可以使用“aliases”属性。来自docs

    该属性提供了一个外部位置列表,可以从这些位置为此上下文加载资源。别名列表的格式应为“/aliasPath1=docBase1,/aliasPath2=docBase2”,其中 aliasPathN 必须包含前导“/”,而 docBaseN 必须是 .war 文件或目录的绝对路径。将在第一个 docBaseN 中搜索 aliasPathN 是资源的前导路径段的资源。如果没有这样的别名,则将以通常的方式搜索资源。如果上下文未部署,这些外部位置将不会被清空。

    【讨论】:

    • 请注意,这在 Tomcat 8 中不再有效
    【解决方案4】:

    多年后,我们可以在 webapp-servlet.xml 文件中使用 Spring Web MVC 执行以下操作:

    <mvc:resources mapping="/static/**" location="/static/" />
    

    【讨论】:

    • 据我所知,如果静态内容位于外部目录中,这将不起作用。
    【解决方案5】:

    在基于定义 XML 的解决方案对我不起作用之后,我发现 this answer 非常有用。花了大约一分钟,还有一个小的代码更改:我修改了这一行

    this.basePath = getServletContext().getRealPath(getInitParameter("basePath"));

    进入

    this.basePath = getInitParameter("basePath");

    【讨论】:

    • 我也遇到过这种情况,但你的回答对我帮助很大,谢谢;)!
    【解决方案6】:

    您可以将图像文件夹部署为单独的 web 应用程序,并将该文件夹的位置定义为文件系统中的任何位置。

    $CATALINA_HOME/conf/[enginename]/[hostname]/ 目录中的 XML 文件中创建一个 Context 元素 其中引擎名可能是“Catalina”,主机名可能是“localhost”。

    根据您希望从中查看图像的路径 URL 命名文件,因此如果您的 web 应用具有路径“博客”,您可以将 XML 文件命名为 blog#images.xml,这样您的图像将在 @987654323 处可见@

    XML文件的内容应该是&lt;Context docBase="/filesystem/path/to/images"/&gt;

    注意不要取消部署这个 web 应用,因为这可能会删除你所有的图像!

    【讨论】:

    • 这个方案的问题是Tomcat自动部署镜像需要5-10秒。
    【解决方案7】:

    不要将 Tomcat 配置为重定向请求,而是将 Apache 用作带有 Apache Tomcat connector 的前端,这样 Apache 只提供静态内容,而向 tomcat 询问动态内容。

    使用 JKmount 指令(或其他指令),您可以准确指定将哪些请求发送到 Tomcat。

    对静态内容(例如图像)的请求将由 Apache 使用标准虚拟主机配置直接提供服务,而在 JKMount 指令中定义的其他请求将发送给 Tomcat 工作人员。

    我认为这个实现会给你最大的灵活性和对整个应用程序的控制。

    【讨论】:

    • 这是 Tomcat 4 的时代。
    • 阅读您的评论后,我刚刚意识到我已经包含了一些旧文档的链接。现在正在纠正这个问题。
    • 我已使用以下方式处理此问题 # 示例 Web 应用程序中的静态文件由 Apache Alias /example var\opt\tomcat\webapps\example JkMount /example/*.jpg ajp13 JkMount /example 提供服务/*.png ajp13 JkMount /example/*.gif ajp13
    【解决方案8】:

    你可以有一个重定向 servlet。在您的 web.xml 中,您将拥有:

    <servlet>
        <servlet-name>images</servlet-name>
        <servlet-class>com.example.images.ImageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>images</servlet-name>
        <url-pattern>/images/*</url-pattern>
    </servlet-mapping>
    

    您的所有图像都在“/images”中,这将被 servlet 截获。然后它会读入任何文件夹中的相关文件并立即将其送回。例如,假设您的图像文件夹中有一个 gif,c:\Server_Images\smilie.gif。在网页中将是&lt;img src="http:/example.com/app/images/smilie.gif"...。在 servlet 中,HttpServletRequest.getPathInfo() 将产生“/smilie.gif”。 servlet 将在文件夹中找到哪个。

    【讨论】:

    • 我认为你的回答不够清楚,com.example.images.ImageServlet 是你自己写的。
    • Answer 很像这里的 FileServlet - balusc.blogspot.com/2007/07/fileservlet.html 。彻底的解决方案和信息丰富的页面,这就是我所采用的。
    • 这会导致 HTTP 重定向吗?
    • @ebi 不,它不会导致 HTTP 重定向。
    猜你喜欢
    • 2013-05-30
    • 2011-09-23
    • 1970-01-01
    • 2013-09-04
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多