получить абсолютный путь к папке веб-содержимого apache из файла класса java

Нужно получить абсолютный путь в файле класса java внутри динамического веб-приложения...

  • На самом деле мне нужно получить путь к папке веб-приложений apache... где развернуты веб-приложения

  • например /apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg

  • Нужно получить это в файле класса java, а не на странице jsp или на любой странице просмотра...

Любые идеи?


person Ahsan Mumtaz    schedule 22.09.2011    source источник


Ответы (7)


На самом деле мне нужно получить путь к папке веб-приложений apache... где развернуты веб-приложения

напр. /apache-root/webapps/my-deployed-app/WebContent/images/imagetosave.jpg

Как упоминалось во многих других ответах, вы можете просто использовать ServletContext#getRealPath(), чтобы преобразовать относительный путь веб-содержимого в абсолютный путь к файловой системе диска, чтобы его можно было использовать в дальнейшем в File или FileInputStream. ServletContext находится в сервлетах, доступных унаследованному getServletContext() метод:

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

Однако имя файла "imagetosave.jpg" указывает на то, что вы пытаетесь сохранить загруженное изображение FileOutputStream. Общедоступная папка веб-контента — это неправильное место для хранения загруженных изображений! Все они будут потеряны при каждом повторном развертывании веб-приложения или даже при перезапуске сервера с очисткой. Простая причина в том, что загруженные образы вообще не содержатся в WAR-файле, который нужно развернуть.

Вам определенно следует поискать другое место за пределами папки развертывания веб-приложения в качестве более постоянного хранилища загруженных изображений, чтобы оно оставалось неповрежденным при нескольких развертываниях/перезапусках. Лучший способ — подготовить фиксированную папку файловой системы на локальном диске, такую ​​как /var/webapp/uploads, и предоставить ее в качестве параметра конфигурации. Наконец, просто сохраните изображение там.

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

Смотрите также:

person BalusC    schedule 23.10.2012
comment
Спас мою жизнь! Спасибо! - person TejjD; 22.10.2015
comment
В таком случае браузер сможет асинхронно загружать изображения? Как и в случае с WebContent, мы можем просто указать img src= ? Что здесь? - person Paras; 26.02.2016
comment
@Paras: см. последнюю ссылку См. также. - person BalusC; 26.02.2016
comment
Я сделал, но после моего комментария. :П - person Paras; 26.02.2016
comment
Краткий и надежный ответ. Спасибо! - person ethane; 21.05.2017
comment
Просто мысль - если запрос покрывается MultiPartRequestWrapper, вы не можете использовать getServletContext(), потому что метод не переопределяется правильно реализацией MultipartRequestWrapper. у меня была эта ошибка - person ha9u63ar; 28.09.2017

Если у вас есть javax.servlet.ServletContext, вы можете позвонить:

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

чтобы получить фактический путь к месту хранения изображения.

Доступ к ServletContext можно получить из javax.servlet.http.HttpSession.

Тем не менее, вы можете захотеть изучить использование:

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

or

servletContext.getResourceAsStream("/images/imagetosave.jpg") 
person Emil H    schedule 22.09.2011

Метод -1:

//шаг 1: импорт java.net.InetAddress;

InetAddress ip = InetAddress.getLocalHost();

//шаг 2: укажите путь к файлу

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

//шаг 3: собрать все кусочки вместе

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-укажите путь к файлу после веб-папки

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

МОЕ ПРЕДЛОЖЕНИЕ

  1. сохраните файл, который вы хотите открыть, в пакете по умолчанию исходной папки и откройте файл напрямую, чтобы все было просто и понятно.
    ПРИМЕЧАНИЕ: это происходит потому, что он присутствует в классе путь к вашей IDE, если вы кодируете без IDE, сохраните его вместо файла класса, скомпилированного Java, или в общей папке, к которой вы можете получить доступ.

РАДОВАТЬСЯ, ВЕСЕЛИТЬСЯ

person Community    schedule 30.09.2014

String path =  MyClass.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

Это должно вернуть ваш абсолютный путь на основе местоположения файла класса.

person Russell Shingleton    schedule 22.09.2011

Мне удалось получить ссылку на ServletContext в фильтре. Что мне больше всего нравится в этом подходе, так это то, что он происходит в методе init(), который вызывается при первой загрузке веб-приложения, что означает, что выполнение происходит только один раз.

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;
}

Я добавил «templatepath» в filterConfig через web.xml:

<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>
person Joe Gerew    schedule 02.03.2012

Вы можете получить путь в контроллере:

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
}
person Koss    schedule 23.10.2012

Вы можете написать 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>
person Gandalf    schedule 22.09.2011