2013-10-14 3 views
0

Скажем, мое веб-приложение находится на стадии разработки в Eclipse, по пути C:\eclipse\workspace\myapp (Windows).Как создать папку в том же каталоге, что и веб-приложение?

Я намерен заставить его сгенерировать папку на том же уровне каталога (C:\eclipse\workspace\myappfiles), чтобы сохранить загруженные файлы (через new File()).

Однако на этапе производства мое веб-приложение будет на пути /var/lib/tomcat7/webapps/myapp (Linux). Затем он должен хранить файлы в /var/lib/tomcat7/webapps/myappfiles.

Как я могу определить эти пути для записи папки и файлов?

Я экспериментировал с некоторыми методами java.io.File, но, похоже, у меня не было метода по умолчанию, который подходит мне для задачи.

EDIT:

Мне нужен путь, что таким образом я мог отобразить путь для прямого доступа к файлам через URL.

+3

Просто комментарий, это довольно плохая идея на практике, вы ожидаете хранить файлы в какой-то файловой системе, например, как [Amazon S3] (http://aws.amazon.com/s3/) – david99world

ответ

0

Он должен получить работу:

File currentDirectory = new File(""); 
String commonPath = currentDirectory.getAbsolutePath(); 
commonPath = commonPath.substring(path.lastIndexOf(File.separator) + 1); 
File myFilesDir = new File(commonPath + "myappfiles"); 
myFilesDir.mkdirs(); 
0

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

Один простой способ и переносимый способ сделать это, чтобы поместить расположение myappfiles в вашем web.xml:

<servlet> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>com.example.mycompany.MyServlet</servlet-class> 
    <init-param> 
    <param-name>appfilesdir</param-name> 
    <param-value>/var/lib/tomcat7/webapps/myappfiles</param-value> 
    </init-param> 
</servlet> 

Затем использовать GenericServlet.getInitParameter из вашего сервлета, чтобы прочитать его и использовать его:

public class MyServlet extends HttpServlet 
{ 
    private String myAppFilesDir; 

    public void init(ServletConfig config) 
     throws ServletException 
    { 
     myAppFilesDir = getInitParameter("appfilesdir"); 
    } 

} 
+0

Понял, и хорошая практика. В этом случае вы не очень жестко кодируете, где находится ваше приложение, но где работают ваши файлы приложений. Как указано в комментариях, это хороший подход для разделения этих двух, поскольку это позволяет вам обновить контейнер сервлета, не затрагивая файлы, которые требуется вашему приложению. Однако, если вы хотите последовательно определить, где находится ваше приложение, вы должны использовать решение @ KayKay, чтобы всегда определять CATALINA_HOME или использовать собственную переменную окружения, чтобы избежать проблем в случаях, когда несколько кошек развертываются на одном компьютере. – lreeder

0

Как david99world говорит в своем комментарии: Это действительно плохая идея. Кроме того, он может даже не работать в будущих версиях tomcat или в разных конфигурациях: Tomcat может быть настроен так, чтобы не иметь «взорванных» веб-приложений вообще - например, запустите от zipped *.war файлов. Кроме того, у tomcat могут не быть права на запись в свой собственный каталог webapps (основная мера предосторожности для упрощения системы).

Представьте, что кто-то загружает файл с именем «explorer.jsp» с помощью базового проводника файлов, реализованного в jsp: не заботясь о нем, tomcat с удовольствием интерпретирует это как код, который необходимо выполнить на стороне сервера.

То, что вы хотите сделать, это:

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

Вам потребуется немного немного больше работы, таким образом, но в результате установки настолько гораздо более безопасным вне коробки.

+0

Это комментарий @ david99world. – lreeder

+0

Спасибо - исправлено. Я не знаю, что мои глаза сделали со мной –

Смежные вопросы