web-dev-qa-db-ja.com

JSFのmanaged-beanからリソースファイルへのパスを取得する

この状況が発生しました。マネージドBeanから新しいアバター画像を配置する前に、ユーザーの古いアバター画像を削除しようとしています。

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

私は少しググったが、ExternalContextからそのフォルダへのパスを次のように取得できるようだ。

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

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

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

12

ファイルがWARに埋め込まれていること、およびWeb相対パスに基づいてファイルを解決するための ExternalContext#getRealPath() メソッドを探していることを理解しています。 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);
// ...

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

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

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

28
BalusC