如何配置Tomcat从webapps外部的外部文件夹提供图像?

Sat*_*ish 68 tomcat

如何使用Tomcat从webapps外部的公用文件夹提供图像文件?我不想在不同的端口上使用第二个Apache文件服务器,因为图像文件是同一个应用程序的一部分.我不想在webapps中为公共文件夹创建一个符号链接,因为我的应用程序被部署为war文件....是否有一个更简单的解决方案,类似于在webapps中使用静态内容的默认servlet,用于外部webapps之外的静态内容

del*_*ant 76

这就是我做的方式,它对我来说很好.(在Tomcat 7.x上完成)

添加<context>tomcat/conf/server.xml文件.

Windows示例:

<Context docBase="c:\Documents and Settings\The User\images" path="/project/images" />
Run Code Online (Sandbox Code Playgroud)

Linux示例:

<Context docBase="/var/project/images" path="/project/images" />
Run Code Online (Sandbox Code Playgroud)

像这样(在上下文中):

<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>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您应该能够在以下位置找到文件(例如/var/project/images/NameOfImage.jpg):

http://localhost:8080/project/images/NameOfImage.jpg 
Run Code Online (Sandbox Code Playgroud)

  • *此*应标记为答案恕我直言 (5认同)
  • 在 apache tomcat 8.0.27 上运行良好。问候! (2认同)

sbl*_*ndy 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>
Run Code Online (Sandbox Code Playgroud)

您的所有图像都将位于"/ images"中,这些图像将被servlet拦截.然后它将在相关文件中读取任何文件夹并立即将其提供给它.例如,假设您的images文件夹中有一个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`是你自己写的东西. (47认同)
  • 答案很像FileServlet - http://balusc.blogspot.com/2007/07/fileservlet.html.彻底的解决方案和信息丰富的页面,这就是我的用途. (2认同)

gam*_*ela 18

在Tomcat 7中,您可以使用"别名"属性.来自文档:

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

  • 请注意,这不再适用于Tomcat 8 (2认同)

Jus*_*ery 7

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

在enginename可能为"Catalina"且hostname可能为"localhost" 的目录中的XML文件中创建Context元素$CATALINA_HOME/conf/[enginename]/[hostname]/.

根据您希望从中查看图像的路径URL命名文件,因此,如果您的webapp具有路径"blog",则可以命名XML文件blog#images.xml,以便在以下位置显示您的图像example.com/blog/images/

XML文件的内容应该是 <Context docBase="/filesystem/path/to/images"/>

小心不要取消部署此webapp,因为这可能会删除所有图像!