Я хочу считать файл из веб-приложения Java. Я не хочу давать полный путь файла. Я просто хочу поместить файл в некоторый каталог моего веб-приложения.
Или
Это может быть помещено наряду с .war файлом (упакованное веб-приложение).
Какой относительный путь дать для файла. Я попробовал ./filename.csv
но это не работало.
========
Я поставлю a WAR
файл (упакованное веб-приложение) моему клиенту. Это веб-приложение будет читать, файл (позволяет, говорят SuppliedFile.csv
) который будет скопирован в сервер клиентом. Таким образом, мне нужен механизм (который будет работать независимо от того, распакует ли сервер приложений WAR
или не) так, чтобы веб-приложение могло считать тот файл.
Примечание: Я не использую SuppliedFile.csv
в сервлете... Я использую его в простом классе Java...
Вам действительно нужно загрузить его из файла? Если вы разместите его в своих классах (в WEB-INF / classes), вы можете получить для него InputStream с помощью загрузчика классов:
InputStream csv =
SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");
Если у вас есть путь к этому файлу на веб-сервере, вы можете получить реальный путь в файловой системе сервера, используя ServletContext.getRealPath ( ) . Обратите внимание, что не гарантируется работа в каждом контейнере (поскольку контейнер не требуется для распаковки файла WAR и хранения содержимого в файловой системе - хотя большинство из них). И я думаю, это не будет работать с файлами в / WEB-INF, поскольку у них нет виртуального пути.
Альтернативой было бы использование ServletContext.getResource () , которое возвращает URI. Этот URI может быть URL-адресом "file:", но на это нет гарантии.
Вы можете просто получить доступ к заранее заданному пути к файлу в системе. Это предпочтительнее, поскольку файлы, добавленные в каталог webapp, могут быть потеряны или webapp может быть не распакован в зависимости от конфигурации системы.
На нашем сервере мы определяем системное свойство, установленное в JVM сервера приложений, которое указывает на «домашний каталог» для внешних данных нашего приложения. Конечно, это требует модификации конфигурации сервера приложений (-DAPP_HOME = ... добавляется в JVM_OPTS при запуске), мы делаем это в основном для облегчения тестирования кода, выполняемого вне контекста сервера приложений.
Вы можете так же легко получить путь из конфигурации сервлета:
<web-app>
<context-param>
<param-name>MyAppHome</param-name>
<param-value>/usr/share/myapp</param-value>
</context-param>
...
</web-app>
Затем получить этот путь и использовать его как базовый путь для чтения файла, предоставленного клиентом.
public class MyAppConfig implements ServletContextListener {
// NOTE: static references are not a great idea, shown here for simplicity
static File appHome;
static File customerDataFile;
public void contextInitialized(ServletContextEvent e) {
appHome = new File(e.getServletContext().getInitParameter("MyAppHome"));
File customerDataFile = new File(appHome, "SuppliedFile.csv");
}
}
class DataProcessor {
public void processData() {
File dataFile = MyAppConfig.customerDataFile;
// ...
}
}
Как я уже говорил, наиболее вероятная проблема, с которой вы столкнетесь, - это ограничения безопасности. Ничто не гарантирует, что веб-приложения могут подготовить любые файлы, расположенные выше их корня. Но обычно существуют простые методы предоставления исключений для определенных путей к определенным веб-приложениям.
Независимо от кода, в котором вам затем потребуется доступ к этому файлу, поскольку вы работаете в веб-приложении, вам гарантируется, что оно сначала инициализируется, и вы можете спрятать его значение в любом удобном месте, чтобы остальная часть вашего кода могла ссылаться на него, как в моем примере или еще лучше, просто передайте путь в качестве параметра коду, который в нем нуждается.