получить абсолютный путь к папке apache webcontents из файла класса java [дубликат]
этот вопрос уже есть ответ здесь:
необходимо получить абсолютный путь в файле класса java, внутри динамического веб-приложения...
на самом деле мне нужно получить путь к папке apache webapps... где веб-приложений, развернутых
например /Апач-корень/веб-приложений/Мой-развернуть-приложение/папку WebContent/изображения/imagetosave.формат JPG
нужно получить это в файле класса java, а не на странице jsp или любой странице просмотра...
какие идеи?
7 ответов
на самом деле мне нужно получить путь к папке apache webapps... где развернуты webapps
например /Апач-корень/веб-приложений/Мой-развернуть-приложение/папку WebContent/изображения/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
. Общедоступной папкой webcontent является неправильно место для хранения загруженных изображений! Все они будут потеряны, когда webapp будет перераспределен или даже когда сервер будет перезапущен с очисткой. Простая причина в том, что загруженные изображения они вообще не содержатся в файле войны, который будет развернут.
вы должны обязательно искать другое место за пределами папка webapp deploy как более постоянное хранилище загруженных изображений, чтобы она оставалась неповрежденной при нескольких развертываниях / перезапусках. Лучший способ-подготовить фиксированную локальную папку файловой системы диска, такую как /var/webapp/uploads
и предоставьте это как некоторую настройку конфигурации. Наконец, просто сохраните изображение там.
String uploadsFolder = getItFromConfigurationFileSomehow(); // "/var/webapp/uploads"
File file = new File(uploadsFolder, "imagetosave.jpg");
// ...
посмотреть также:
Если у вас есть javax.сервлет.ServletContext вы можете вызвать:
servletContext.getRealPath("/images/imagetosave.jpg")
чтобы получить фактический путь, где хранится изображение.
ServletContext можно получить из javax.сервлет.http.Объекта httpsession.
однако, вы можете захотеть взглянуть на использование:
servletContext.getResource("/images/imagetosave.jpg")
или
servletContext.getResourceAsStream("/images/imagetosave.jpg")
String path = MyClass.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
Это должно возвращать ваш абсолютный путь на основе местоположения файла класса.
я смог получить ссылку на 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 через интернет.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>
вы можете получить путь в контроллер:
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 :
//Шаг 1 : импорт Java.чистая.InetAddress;
InetAddress ip = InetAddress.getLocalHost();
/ / step2: укажите путь к файлу
String filepath="GIVE YOUR FILE PATH AFTER WEB FOLDER something like /images/grid.png"
//step3: захватить все peices вместе
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;
мой Предложение
- сохранить файл, который вы хотите открыть в пакете по умолчанию исходной папки и открыть файл непосредственно, чтобы сделать вещи простыми и ясными.
Примечание : это происходит потому, что он присутствует в пути к классу вашей IDE, если вы кодируете без IDE, то держите его вместо вашего Java скомпилированного файла класса или в общей папке, к которой вы можете получить доступ.
УДАЧИ
Вы можете написать 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
}
//...
}
и настроить его в интернете.в XML
<listener>
<listener-class>my.package.MyServletContextListener</listener-class>
</listener>