この状況が発生しました。マネージドBeanから新しいアバター画像を配置する前に、ユーザーの古いアバター画像を削除しようとしています。
String fileName = "resources/img/useravatars/" + getSessionBean().getSearchAccount().getAvatar();
File f = new File(fileName);
私は少しググったが、ExternalContextからそのフォルダへのパスを次のように取得できるようだ。
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext(). ...
しかし、 class docs から適切なメソッドを見つけることができませんでした。 ...の代わりに何を置くかを手伝っていただけませんか、またはより良い解決策を提案してください。
PS。どういうわけか、リンクをハードコーディングすることは可能だと思いますが、今のところ運がありません。
ファイルが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フォルダーの外部から画像をロードします