12

次のような状況があります。マネージド Bean から新しいアバター イメージを配置する前に、ユーザーの古いアバター イメージを削除しようとしています。

String fileName = "resources/img/useravatars/" + getSessionBean().getSearchAccount().getAvatar();
File f = new File(fileName);

少しグーグルで調べたところ、次のように ExternalContext からそのフォルダーへのパスを取得できるようです。

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext(). ...

しかし、クラス docsから適切なメソッドを見つけることができませんでした。... の代わりに何を入れるか、またはより良い解決策を提案してください。

PS。どういうわけか、リンクをハードコードすることは可能だと思いますが、今のところうまくいきません。

4

1 に答える 1

29

ExternalContext#getRealPath()ファイルがWARに埋め込まれていること、およびWeb相対パスに基づいてファイルを解決する方法を探していることを理解しています。Javadocによると、このメソッドはJSF 2.0で導入されており、JSF1.xには存在しません。あなたはJSF1.xを使用しているようです。そうでなければ、この質問をしなかったでしょう。代わりに使用する必要がありますServletContext#getRealPath()(これは、新しいJSF 2.0メソッドが内部で委任しているものでもあります)。

String relativeWebPath = "/resources/img/useravatars/" + ...;
ServletContext servletContext = (ServletContext) externalContext.getContext();
String absoluteDiskPath = servletContext.getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
// ...

ただし、大きな問題があります。拡張されたWARに書き込むことはできますが、書き込むべきではありません。ファイルの削除も書き込み中です。WARを再デプロイするかサーバーを再起動するたびに、すべての変更が元に戻され、拡張されたWARは初期状態を保持します。これにより、最後のデプロイ以降に拡張されたWARで行われたすべての変更が失われます。

これらのファイルを外部の場所に保存する必要があります。そのルートの場所は、外部構成(プロパティ)ファイルでハードコーディングまたは定義できます。java.io.Fileこのようにして、通常の方法でコンテンツを使用できます。

外部の場所からファイルを提供する方法はいくつかあります。それらはすべて、次の質問の回答にあります。<h:graphicImage>または<img>タグを使用して、webapps / webcontext/deployフォルダーの外部から画像をロードします。

于 2011-06-07T21:55:36.703 に答える