Tomcatを使用して、webappsの外部のパブリックフォルダーから画像ファイルを提供するにはどうすればよいですか?画像ファイルは同じアプリの一部であるため、別のポートで2番目のApacheファイルサーバーを使用したくありません。私のアプリはwarファイルとしてデプロイされているため、webapps内のパブリックフォルダーへのシンボリックリンクを作成したくありません。
リダイレクトサーブレットを使用できます。 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」を生成します。サーブレットがフォルダー内で見つけるもの。
これは私がやった方法であり、私にとってはうまくいきました。 (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 7では、「エイリアス」プロパティを使用できます。 docs から:
この属性は、このコンテキストのリソースをロードする外部ロケーションのリストを提供します。エイリアスのリストは、「/ aliasPath1 = docBase1、/ aliasPath2 = docBase2」の形式である必要があります。aliasPathNには先頭に「/」を含める必要があり、docBaseNは.warファイルまたはディレクトリへの絶対パスである必要があります。リソースは、aliasPathNがリソースの先頭パスセグメントである最初のdocBaseNで検索されます。そのようなエイリアスがない場合、リソースは通常の方法で検索されます。コンテキストが展開されていない場合、これらの外部の場所は空になりません。
イメージフォルダーを個別の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をアンデプロイしないように注意してください!
Tomcatを設定してリクエストをリダイレクトする代わりに、Apacheがフロントエンドとして Apache Tomcatコネクター を使用して、Apacheが静的コンテンツのみを提供し、Tomcatに動的コンテンツを要求します。
JKmountディレクティブ(またはその他)を使用して、Tomcatに送信する要求を正確に指定できます。
画像などの静的コンテンツの要求は、標準の仮想ホスト構成を使用してApacheによって直接処理されますが、JKMountディレクティブで定義された他の要求はTomcatワーカーに送信されます。
この実装により、アプリケーション全体で最も柔軟性と制御が得られると思います。
XMLの定義に基づくソリューションがどれも役に立たなかった後、 この回答 は非常に役立つことがわかりました。約1分かかり、コードが少し変更されました。この行を変更しました
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>
2つの属性docBaseとpathを使用して、ホスト要素内にコンテキスト要素を追加します。
1)docBase:はハードドライブディレクトリを表します2)path:は表します静的コンテンツを提供するURI。
例:C:\ Ankur\testFilesディレクトリ内に7.pngがある場合、次のように7.pngファイルにアクセスできます。
http:// localhost:8081/companyLogo/7.png
詳細については、 ブログ を確認してください