Как я могу получить реальный путь к файлу в моей папке WebContent?
Мне нужно получить реальный путь к файлу в моем каталоге WebContent, чтобы используемая мной среда могла получить доступ к этому файлу. Он принимает только строковый файл в качестве атрибута, поэтому мне нужно получить реальный путь к этому файлу в каталоге WebContent.
Я использую Spring Framework, поэтому решение должно быть возможным в Spring.
8 ответов
Если вам нужно это в сервлете, используйте getServletContext().getRealPath("/filepathInContext")
!
getServletContext().getRealPath("") - этот способ не будет работать, если контент доступен из архива.war. getServletContext() будет нулевым.
В этом случае мы можем использовать другой способ получить реальный путь. Это пример получения пути к файлу свойств C:/Program Files/Tomcat 6/webapps/myapp/WEB-INF/classes/somefile.properties:
// URL returned "/C:/Program%20Files/Tomcat%206.0/webapps/myapp/WEB-INF/classes/"
URL r = this.getClass().getResource("/");
// path decoded "/C:/Program Files/Tomcat 6.0/webapps/myapp/WEB-INF/classes/"
String decoded = URLDecoder.decode(r.getFile(), "UTF-8");
if (decoded.startsWith("/")) {
// path "C:/Program Files/Tomcat 6.0/webapps/myapp/WEB-INF/classes/"
decoded = decoded.replaceFirst("/", "");
}
File f = new File(decoded, "somefile.properties");
Вы должны указать java изменить путь с вашего компьютера на ваш проект java, так что если вы используете spring:
@Autowired
ServletContext c;
String UPLOAD_FOLDEdR=c.getRealPath("/images");
но если вы используете сервлеты, просто используйте
String UPLOAD_FOLDEdR = ServletContext.getRealPath("/images");
так что путь будет /webapp/images/
:)
В подобных ситуациях я стремлюсь извлечь контент, который мне нужен, как ресурс (MyClass.getClass(). GetResourceAsStream()), записать его как файл во временную папку и использовать этот файл для другого вызова.
Таким образом, мне не нужно беспокоиться о содержимом, которое содержится только в jar-файлах или находится где-то в зависимости от используемого в данный момент веб-контейнера.
Вы можете использовать интерфейс Spring Resource (и особенно ServletContextResource): http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html
Мое решение для: ..../webapps/mydir/ (..../webapps/ROOT/../mydir/)
String dir = request.getSession().getServletContext().getRealPath("/")+"/../mydir";
Files.createDirectories(Paths.get(dir));
Этот подход использует загрузчик ресурсов для получения абсолютного пути к файлу в вашем приложении, а затем переходит на несколько папок в корневую папку приложения. Не требуется контекст сервлета! Это должно работать, если у вас есть "web.xml" в папке WEB-INF. Обратите внимание, что вы можете рассмотреть возможность использования этого исключительно для разработки, так как этот тип конфигурации обычно лучше хранить вне приложения.
public String getAppPath()
{
java.net.URL r = this.getClass().getClassLoader().getResource("web.xml");
String filePath = r.getFile();
String result = new File(new File(new File(filePath).getParent()).getParent()).getParent();
if (! filePath.contains("WEB-INF"))
{
// Assume we need to add the "WebContent" folder if using Jetty.
result = FilenameUtils.concat(result, "WebContent");
}
return result;
}
Включите запрос в качестве параметра. Затем Spring передаст объект запроса, когда вызовет сопоставленный метод.
@RequestMapping .....
public String myMethod(HttpServletRequest request) {
String realPath = request.getRealPath("/somefile.txt");
...
Попробуйте использовать это, когда вы хотите использовать arff.txt на уровне разработки и производства тоже
String path=getServletContext().getRealPath("/WEB-INF/files/arff.txt");