如何配置 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 "%r" %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 上完成)
将<context>
添加到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!!! 它不适合我 记得确保你的在 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文件的内容应该是<Context docBase="/filesystem/path/to/images"/>
注意不要取消部署这个 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。在网页中将是<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 外部文件夹的图像? [复制]的主要内容,如果未能解决你的问题,请参考以下文章