web-dev-qa-db-ja.com

webappsの外部フォルダから画像を提供するようにTomcatを設定する方法は?

Tomcatを使用して、webappsの外部のパブリックフォルダーから画像ファイルを提供するにはどうすればよいですか?画像ファイルは同じアプリの一部であるため、別のポートで2番目のApacheファイルサーバーを使用したくありません。私のアプリはwarファイルとしてデプロイされているため、webapps内のパブリックフォルダーへのシンボリックリンクを作成したくありません。

66
Sathish

リダイレクトサーブレットを使用できます。 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」にあり、サーブレットによってインターセプトされます。その後、任意のフォルダーの関連ファイルを読み取り、すぐに提供します。たとえば、画像フォルダc:\ Server_Images\smilie.gifにgifがあるとします。 Webページでは_<img src="http:/example.com/app/images/smilie.gif"..._になります。サーブレットでは、 HttpServletRequest.getPathInfo() は「/smilie.gif」を生成します。サーブレットがフォルダー内で見つけるもの。

28
sblundy

これは私がやった方法であり、私にとってはうまくいきました。 (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 
75
delkant

Tomcat 7では、「エイリアス」プロパティを使用できます。 docs から:

この属性は、このコンテキストのリソースをロードする外部ロケーションのリストを提供します。エイリアスのリストは、「/ aliasPath1 = docBase1、/ aliasPath2 = docBase2」の形式である必要があります。aliasPathNには先頭に「/」を含める必要があり、docBaseNは.warファイルまたはディレクトリへの絶対パスである必要があります。リソースは、aliasPathNがリソースの先頭パスセグメントである最初のdocBaseNで検索されます。そのようなエイリアスがない場合、リソースは通常の方法で検索されます。コンテキストが展開されていない場合、これらの外部の場所は空になりません。
18
gamliela

イメージフォルダーを個別のwebappとしてデプロイし、そのフォルダーの場所をファイルシステム内の任意の場所に定義できます。

ディレクトリ$CATALINA_HOME/conf/[enginename]/[hostname]/のXMLファイルにContext要素を作成します。ここで、enginenameは「Catalina」、hostnameは「localhost」です。

画像を表示するパスURLに基​​づいてファイルに名前を付けます。したがって、webappにパス「blog」がある場合、XMLファイルにblog#images.xmlという名前を付け、example.com/blog/images/に画像が表示されるようにします。

XMLファイルのコンテンツは<Context docBase="/filesystem/path/to/images"/>である必要があります

すべての画像が削除される可能性があるため、このwebappをアンデプロイしないように注意してください!

7
Justin Emery

Tomcatを設定してリクエストをリダイレクトする代わりに、Apacheがフロントエンドとして Apache Tomcatコネクター を使用して、Apacheが静的コンテンツのみを提供し、Tomcatに動的コンテンツを要求します。

JKmountディレクティブ(またはその他)を使用して、Tomcatに送信する要求を正確に指定できます。

画像などの静的コンテンツの要求は、標準の仮想ホスト構成を使用してApacheによって直接処理されますが、JKMountディレクティブで定義された他の要求はTomcatワーカーに送信されます。

この実装により、アプリケーション全体で最も柔軟性と制御が得られると思います。

3
adilei

XMLの定義に基づくソリューションがどれも役に立たなかった後、 この回答 は非常に役立つことがわかりました。約1分かかり、コードが少し変更されました。この行を変更しました

this.basePath = getServletContext().getRealPath(getInitParameter("basePath"));

this.basePath = getInitParameter("basePath");

1
Yossi Shasho

これは非常に簡単で、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>

2つの属性docBaseとpathを使用して、ホスト要素内にコンテキスト要素を追加します。

1)docBase:はハードドライブディレクトリを表します2)path:は表します静的コンテンツを提供するURI。

例:C:\ Ankur\testFilesディレクトリ内に7.pngがある場合、次のように7.pngファイルにアクセスできます。

http:// localhost:8081/companyLogo/7.png

詳細については、 ブログ を確認してください

0
Ankur jain