Java - Относительный путь файла в веб-приложении Java

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

Или

Это может быть помещено наряду с .war файлом (упакованное веб-приложение).

Какой относительный путь дать для файла. Я попробовал ./filename.csv но это не работало.

========

Обновленный

========

Я поставлю a WAR файл (упакованное веб-приложение) моему клиенту. Это веб-приложение будет читать, файл (позволяет, говорят SuppliedFile.csv) который будет скопирован в сервер клиентом. Таким образом, мне нужен механизм (который будет работать независимо от того, распакует ли сервер приложений WAR или не) так, чтобы веб-приложение могло считать тот файл.

Примечание: Я не использую SuppliedFile.csv в сервлете... Я использую его в простом классе Java...

32
задан Yatendra Goel 7 March 2010 в 13:03
поделиться

3 ответа

Вам действительно нужно загрузить его из файла? Если вы разместите его в своих классах (в WEB-INF / classes), вы можете получить для него InputStream с помощью загрузчика классов:

InputStream csv = 
   SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");
28
ответ дан 27 November 2019 в 20:59
поделиться

Если у вас есть путь к этому файлу на веб-сервере, вы можете получить реальный путь в файловой системе сервера, используя ServletContext.getRealPath ( ) . Обратите внимание, что не гарантируется работа в каждом контейнере (поскольку контейнер не требуется для распаковки файла WAR и хранения содержимого в файловой системе - хотя большинство из них). И я думаю, это не будет работать с файлами в / WEB-INF, поскольку у них нет виртуального пути.

Альтернативой было бы использование ServletContext.getResource () , которое возвращает URI. Этот URI может быть URL-адресом "file:", но на это нет гарантии.

9
ответ дан 27 November 2019 в 20:59
поделиться

Вы можете просто получить доступ к заранее заданному пути к файлу в системе. Это предпочтительнее, поскольку файлы, добавленные в каталог 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;
        // ...
    }
}

Как я уже говорил, наиболее вероятная проблема, с которой вы столкнетесь, - это ограничения безопасности. Ничто не гарантирует, что веб-приложения могут подготовить любые файлы, расположенные выше их корня. Но обычно существуют простые методы предоставления исключений для определенных путей к определенным веб-приложениям.

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

14
ответ дан 27 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: