如何配置 Tomcat 以提供来自 webapps 外部文件夹的图像? [复制]

Posted

技术标签:

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

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

【问题讨论】:

moreofless.co.uk/… 【参考方案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 重定向。

以上是关于如何配置 Tomcat 以提供来自 webapps 外部文件夹的图像? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何配置Tomcat连接MySQL

如何配置Tomcat连接MySQL

如何配置 Tomcat JULI 日志记录以滚动日志文件?

Tomcat--配置

如何为 tomcat 6 及其部署的 webapps 正确配置 JNDI?

如何设置不同的上下文以指向 webapps Tomcat/Java 之外的外部目录