web-dev-qa-db-ja.com

JSFマネージドBeanでWebアプリのルートパスを取得します

JsfマネージドBeanのexample/webフォルダー(下の画像を参照)にアクセスしようとしていますが、アクセスする方法が見つからないようです。

Im trying to access the **example/web** folder (see below in the image) in a jsf managed bean but cant seem to find a way to do it

どうも

9
hari

何らかの理由でそれをFileとして取得したい場合は、 ExternalContext#getRealPath() が必要です。これにより、相対Webパスが絶対ディスクファイルシステムに変換されます。 Webのルートフォルダが必要なので、_/_を渡すだけです。

_String absoluteWebPath = externalContext.getRealPath("/");
File webRoot = new File(absoluteWebPath);
// ...
_

具体的な問題とは無関係、Webフォルダへの絶対ローカルディスクファイルシステムパスがあると考えていた機能要件は何でもは正しい解決策ですが、間違いなく別の方法で解決する必要があります。そして確かに、他の答えに対するあなたのコメントによると、

フォルダ内のファイルをアップロードしようとしていて、相対パスを使用しているため

あなたは間違った道を進んでいます。アップロードしたファイルをWebアプリのデプロイ期間より長く保持する場合は、そこに保存しないでください。 Webアプリケーションを再デプロイするたびに(およびサーバーを再起動した場合でも一部のサーバー構成で)、アップロードされたファイルは、元のWARファイルの一部として含まれていないという理由だけで完全に失われます。さらに、一部の重いサーバー構成は、ディスク上のWARをまったく拡張しませんが、代わりにメモリ内で、getRealPath()は常にnullを返します。

むしろ、サーバーのデプロイフォルダーの外にあるfixedディスクファイルシステムパスに保存します。そのパスを新しいサーバーコンテキストまたはdocrootとして順番に追加し、別の(仮想)コンテキストパスでアクセスできるようにします。または、ディスクからInputStreamを取得し、応答のOutputStreamに書き込むサーブレットを自家栽培します。この関連する回答も参照してください: アップロードされた画像はページを更新した後にのみ利用可能

14
BalusC

試してみてください

FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()

アプリ内のリソースに対する相対URLを作成します。

実際のパスが必要な場合...

ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
            .getExternalContext().getContext();
String realPath = ctx.getRealPath("/");
17
Paul Vargas

試してください:

String relativePath="/resources/temp/";
String absolutePath=   FacesContext.getCurrentInstance.getExternalContext().getRealPath(relativePath);
File file = new File(absolutePath);

実際のパスを取得します。

例外を回避するために、resources/temp /にtmpファイルを作成します。

0
Harleen

BalusCに感謝したいだけです。コードJava JSPを使用し、Tomcat/Tomeeサーバーで次のコードが機能します。

private Boolean SaveUserItemImage(Part ui, String bid) throws IOException {

    Boolean fileCreate = false;
    OutputStream out = null;
    InputStream filecontent = null;
    ExternalContext ctx = context().getExternalContext();
    String absoluteWebPath = ctx.getRealPath("/");
    String resource_path = absoluteWebPath + "\\resources\\";
    String image_path = resource_path + "\\" + this.itemType + "_images\\";
    String buildFileName = image_path + bid + "_" + getFileName(ui);
    File files = null;

    try {
      files = new File(buildFileName);
      fileCreate = true;
    } catch (Exception ex) {
      System.out.println("Error in Creating New File");
      Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, null, ex);
    }

    if (fileCreate == true) {
      if (files.exists()) {
        /// User may be using same image file name but has been editted
        files.delete();
      }

      try {
        out = new FileOutputStream(files);
        filecontent = ui.getInputStream();
        int read = 0;
        final byte[] bytes = new byte[1024];
        while ((read = filecontent.read(bytes)) != -1) {
          out.write(bytes, 0, read);
        }
        fileCreate = true;
      } catch (FileNotFoundException fne) {
        fileCreate = false;
        Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, "SaveUserItemImage", fne);
      } finally {
        if (out != null) {
          out.close();
        }
        if (filecontent != null) {
          filecontent.close();
        }
        files = null;
      }
    }
    return fileCreate;
  }
0
emm