web-dev-qa-db-ja.com

JavaクラスファイルからApachewebcontentsフォルダーへの絶対パスを取得します

動的Webアプリケーション内のJavaクラスファイルで絶対パスを取得する必要があります。

  • 実際には、Apachewebappsフォルダーのパスを取得する必要があります... webappsがデプロイされている場所

  • 例えば/ Apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg

  • これをJavaクラスファイルで取得する必要があります。jspページやビューページではありません...

何か案は?

9
Ahsan Mumtaz

実際には、Apachewebappsフォルダーのパスを取得する必要があります... webappsがデプロイされている場所

- 例えば。 /Apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg

他の多くの回答で述べられているように、 ServletContext#getRealPath() を使用して、相対Webコンテンツパスを絶対ディスクファイルシステムパスに変換し、Fileまたはでさらに使用できるようにすることができます。 FileInputStreamServletContextは、継承された getServletContext() メソッドで使用可能なサーブレットにあります。

String relativeWebPath = "/images";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath, "imagetosave.jpg");
// ...

ただし、ファイル名 "imagetosave.jpg"は、アップロードされた画像をFileOutputStreamで保存しようとしていることを示します。公開ウェブコンテンツフォルダは間違ったアップロードされた画像を保存する場所です! Webアプリが再デプロイされるとき、またはサーバーがクリーンアップで再起動されるときでさえ、それらはすべて失われます。単純な理由は、アップロードされたイメージがデプロイされるWARファイルにまったく含まれていないことです。

アップロードされた画像のより永続的なストレージとして、別の場所を必ず探す必要がありますoutside webappデプロイフォルダ。これにより、複数のデプロイ/再起動後もそのまま残ります。最善の方法は、/var/webapp/uploadsなどの固定ローカルディスクファイルシステムフォルダーを準備し、これを構成設定として提供することです。最後に、そこに画像を保存します。

String uploadsFolder = getItFromConfigurationFileSomehow(); // "/var/webapp/uploads"
File file = new File(uploadsFolder, "imagetosave.jpg");
// ...

参照:

12
BalusC

方法-1:

// step1:java.net.InetAddressをインポートします;

InetAddress ip = InetAddress.getLocalHost();

// step2:ファイルパスを指定します

String filepath="GIVE YOUR FILE PATH AFTER WEB FOLDER something like /images/grid.png"

// step3:すべてのピースを一緒につかむ

String a ="http://"+ip.getHostAddress()+":"+request.getLocalPort()+""+request.getServletContext().getContextPath()+filepath;

方法-2:

//ステップ:1-絶対URLを取得します

String path = request.getRequestURL().toString();

//ステップ:2-次に、コンテキストパスを使用して部分文字列を作成します

path = path.substring(0, path.indexOf(request.getContextPath()));

//ステップ:3-Webフォルダの後にファイルパスを指定します

String finalPath = "GIVE YOUR FILE PATH AFTER WEB FOLDER something like /images/grid.png"
path +=finalPath;

私のおすすめ

  1. 開きたいファイルをソースフォルダのデフォルトパッケージに保存し、ファイルを直接開いて、物事を単純明快にします。
    注意 : これは、IDE IDEなしでコーディングしている場合は、Javaの代わりに、それを保持するために存在するために発生します。 Java $ ===コンパイルされたクラスファイルまたはアクセス可能な共通フォルダー内。

楽しんで

2
Mateen

Javax.servlet.ServletContextがある場合は、次のように呼び出すことができます。

servletContext.getRealPath("/images/imagetosave.jpg")

画像が保存されている場所の実際のパスを取得します。

サーブレットコンテキストには、javax.servlet.http.HttpSessionからアクセスできます。

ただし、次の使用を検討することをお勧めします。

servletContext.getResource("/images/imagetosave.jpg")

または

servletContext.getResourceAsStream("/images/imagetosave.jpg") 
2
Emil H
String path =  MyClass.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

これにより、クラスのファイルの場所に基づいて絶対パスが返されます。

1

コントローラでパスを取得できます。

public class MyController extends MultiActionController {
private String realPath;

public ModelAndView handleRequest(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    realPath = getServletContext().getRealPath("/");
    String classPath = realPath + "WEB-INF/classes/" + MyClass.ServletContextUtil.class.getCanonicalName().replaceAll("\\.", "/") + ".Java";
    // add any code
}
1
Koss

フィルタでServletContextへの参照を取得できました。このアプローチで私が最も気に入っているのは、Webアプリケーションの最初のロード時に呼び出されるinit()メソッドで発生することです。つまり、実行は1回だけです。

public class MyFilter implements Filter {
    protected FilterConfig filterConfig;
    public void init(FilterConfig filterConfig) {
        String templatePath = filterConfig.getServletContext().getRealPath(filterConfig.getInitParameter("templatepath"));
        Utilities.setTemplatePath(templatePath);
        this.filterConfig = filterConfig;
}

Web.xmlを介してfilterConfigに「templatepath」を追加しました。

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.myapp.servlet.MyFilter</filter-class>
    <init-param>
        <param-name>templatepath</param-name>
        <param-value>/templates</param-value>
    </init-param>
</filter>    
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
1
Joe Gerew

ServletContextListenerを書くことができます:

public class MyServletContextListener implements ServletContextListener
{

    public void contextInitializedImpl(ServletContextEvent event) 
    {
        ServletContext servletContext = event.getServletContext();
        String contextpath = servletContext.getRealPath("/");

        // Provide the path to your backend software that needs it
    }

    //...
}

web.xmlで設定します

<listener>
    <listener-class>my.package.MyServletContextListener</listener-class>
</listener>
0
Gandalf