動的Webアプリケーション内のJavaクラスファイルで絶対パスを取得する必要があります。
実際には、Apachewebappsフォルダーのパスを取得する必要があります... webappsがデプロイされている場所
例えば/ Apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg
これをJavaクラスファイルで取得する必要があります。jspページやビューページではありません...
何か案は?
実際には、Apachewebappsフォルダーのパスを取得する必要があります... webappsがデプロイされている場所
- 例えば。 /Apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg
他の多くの回答で述べられているように、 ServletContext#getRealPath()
を使用して、相対Webコンテンツパスを絶対ディスクファイルシステムパスに変換し、File
またはでさらに使用できるようにすることができます。 FileInputStream
。 ServletContext
は、継承された 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");
// ...
// 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;
//ステップ: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;
楽しんで
Javax.servlet.ServletContextがある場合は、次のように呼び出すことができます。
servletContext.getRealPath("/images/imagetosave.jpg")
画像が保存されている場所の実際のパスを取得します。
サーブレットコンテキストには、javax.servlet.http.HttpSessionからアクセスできます。
ただし、次の使用を検討することをお勧めします。
servletContext.getResource("/images/imagetosave.jpg")
または
servletContext.getResourceAsStream("/images/imagetosave.jpg")
String path = MyClass.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
これにより、クラスのファイルの場所に基づいて絶対パスが返されます。
コントローラでパスを取得できます。
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
}
フィルタで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>
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>