Сервлет - сохранить файл на диск, но не уверен, какой путь использовать? - PullRequest
1 голос
/ 17 марта 2011

У меня есть сервлет, который принимает загрузку файла, я хотел бы сохранить файл в определенном каталоге на диске.Я использую причал.Файловая система выглядит следующим образом:

/jetty
  /bin
  /contexts
  /stuff
  /webapps
    foo.war   // one web app
    grok.war  // another web app
  start.jar

Я запускаю Jetty из этого файла start.jar.В контексте сервлета я не уверен, как сохранить файл в желаемом месте назначения, в папке "/ stuff":

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException 
{
    File downloaded = new File("some/path/here/stuff"); // ?
}

Да - я не уверен, какой путь использоватьЕсть ли способ, которым я могу напечатать текущий рабочий каталог в Java, используя класс File, чтобы выяснить это, может быть?

Спасибо

Ответы [ 4 ]

7 голосов
/ 17 марта 2011

Это довольно плохая практика.Нет гарантии, что он работает на всех сервлетконтейнерах, кроме Jetty.Даже тогда я не уверен, работает ли он на Jetty.По крайней мере, tt сделает ваше веб-приложение не переносимым в другие контейнеры.

Когда расширена WAR (это зависит от сервлет-контейнера , если и , где , то WAR будет расширен!)затем ServletContext#getRealPath() можно использовать для преобразования относительного к веб-контенту пути в абсолютный путь к файловой системе диска.

Когда в сервлете внутри foo.war

String absoluteFooWebPath = getServletContext().getRealPath("/");
* вызывается следующая строка1013 *, и Jetty развернула файл WAR в той же папке веб-приложений, после чего будет получен абсолютный путь к /jetty/webapps/foo.Затем, чтобы перейти оттуда к /jetty/stuff, вам нужно перейти вверх по двум каталогам, а затем оттуда перейти к каталогу stuff.
String absoluteStuffPath = getServletContext().getRealPath("../../stuff");

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

0 голосов
/ 09 марта 2012

Хотя getRealPath, скорее всего, вернет правильный путь при запуске файла war в Jetty, он, скорее всего, будет другим, если в будущем вы переключитесь на другой сервер приложений.

Было бы лучше сделать его настраиваемым параметром в web.xml, используя, например, init-param, который будет просто содержать абсолютный путь к какой-либо ранее существующей папке на сервере. Помещение его в web.xml позволяет изменить его в реальном времени при использовании, например, JBoss. Вы можете использовать getInitParameter на ServletConfig, чтобы получить значение.

0 голосов
/ 17 марта 2011

В файле startup.jar должно быть установлено системное свойство jetty.home .Получите доступ к нему, используя System.getProperty("jetty.home").

0 голосов
/ 17 марта 2011

Вы можете распечатать текущий каталог, родительский каталог, используя следующий код:

import java.io.File;
public class FileOperations {
public static void main (String args[]) {
 File dir1 = new File (".");
 File dir2 = new File ("..");
 try {
   System.out.println ("Current dir : " + dir1.getCanonicalPath());
   System.out.println ("Parent  dir : " + dir2.getCanonicalPath());
   }
 catch(Exception e) {
   e.printStackTrace();
   }
 }
}
...