如何使用Tomcat从webapps外部的公用文件夹提供图像文件?我不想在不同的端口上使用第二个Apache文件服务器,因为图像文件是同一个应用程序的一部分。我不想在webapps中为公共文件夹创建一个符号链接,因为我的应用程序被部署为war文件....是否有一个更简单的解决方案,类似于在webapps中使用静态内容的默认servlet,用于外部webapps之外的静态内容< / p>
答案 0 :(得分:75)
这是我做的方式,它对我来说很好。 (在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
答案 1 :(得分:28)
您可以拥有重定向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拦截。然后它将在相关文件中读取任何文件夹并立即将其提供给它。例如,假设您的images文件夹中有一个gif,c:\ Server_Images \ smilie.gif。在网页中将是<img src="http:/example.com/app/images/smilie.gif"...
。在servlet中,HttpServletRequest.getPathInfo()
将产生“/smilie.gif”。 servlet会在文件夹中找到哪个。
答案 2 :(得分:18)
在Tomcat 7中,您可以使用“别名”属性。来自docs:
此属性提供从中加载此上下文的资源的外部位置列表。别名列表的格式应为“/ aliasPath1 = docBase1,/ aliasPath2 = docBase2”,其中aliasPathN必须包含前导'/',docBaseN必须是.war文件或目录的绝对路径。将在第一个docBaseN中搜索资源,其中aliasPathN是资源的前导路径段。如果没有这样的别名,那么将以通常的方式搜索资源。如果未部署上下文,则不会清空这些外部位置。
答案 3 :(得分:7)
您可以将图像文件夹部署为单独的Web应用程序,并将该文件夹的位置定义为文件系统中的任何位置。
在目录$CATALINA_HOME/conf/[enginename]/[hostname]/
的XML文件中创建 Context 元素
其中enginename可能是'Catalina',主机名可能是'localhost'。
根据您希望查看图像的路径URL命名文件,因此,如果您的webapp具有路径“blog”,则可以将XML文件命名为blog#images.xml
,以便在以下位置显示您的图像example.com/blog/images/
XML文件的内容应为<Context docBase="/filesystem/path/to/images"/>
小心不要取消部署此webapp,因为这可能会删除所有图像!
答案 4 :(得分:3)
不是将Tomcat配置为重定向请求,而是使用Apache作为Apache Tomcat connector的前端,以便Apache只提供静态内容,同时向tomcat请求动态内容。
使用JKmount指令(或其他)可以准确指定将哪些请求发送到Tomcat。
静态内容(如图像)的请求将由Apache使用标准虚拟主机配置直接提供,而JKMount指令中定义的其他请求将发送给Tomcat工作人员。
我认为这种实现方式可以为您提供最大的灵活性和对整个应用程序的控制。
答案 5 :(得分:1)
在没有基于定义XML的解决方案对我有用之后,我发现this answer非常有帮助。花了大约一分钟,一小段代码改变了:我修改了这一行
this.basePath = getServletContext().getRealPath(getInitParameter("basePath"));
到
this.basePath = getInitParameter("basePath");
答案 6 :(得分:0)
这非常简单直接来自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元素中添加context元素。
1)docBase:表示硬盘目录 2)路径:表示您要为其提供静态内容的URI。
例如:如果你在C:\ Ankur \ testFiles目录中有7.png,那么你可以访问7.png文件,如下所示:
http://localhost:8081/companyLogo/7.png
有关详细信息,请查看blog
答案 7 :(得分:-1)
多年以后,我们可以在webapp-servlet.xml
文件中使用Spring Web MVC执行以下操作:
<mvc:resources mapping="/static/**" location="/static/" />