Могу ли я сохранить файл на сервере, используя FileOutputStream? - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь создать RSS-канал динамически и сохранить его на сервере, чтобы получить доступ к созданному RSS-каналу, просто набрав URL из браузера. Возможно ли это сделать?

Я могу создать RSS-канал, но когда я пытаюсь сохранить его на сервере, используя FileOutputStream("WebContent/filename.xml"), он дает мне FileNotFoundException. Верен ли мой подход или есть какой-то другой способ сохранить файл на сервере и получить к нему доступ с помощью простого URL-адреса?

Я использую весенние планировщики, чтобы каждую минуту запускать приложение для динамического создания RSS-канала.

Ответы [ 5 ]

3 голосов
/ 12 июля 2011

Как правило, такие вещи не создаются и не хранятся. Вы обслуживаете динамически и кешируете их (как кеш http (для клиентов), так и внутренний кеш (чтобы вы не загружали их несколько раз)). Spring 3.1 кеш абстракции позволил бы это легко.

Чтобы хранить файлы на сервере, вам необходимо знать, что является корневым каталогом веб-приложения. Вы можете получить его по request.getServletContext().getRealPath("/"). Обратите внимание, что эти файлы исчезнут после отмены развертывания, поэтому вы можете хранить их в абсолютном месте вне приложения. Также обратите внимание, что вы не можете писать их в неразорвавшихся военных архивах. И еще одна вещь - WebContent по умолчанию нет - это проект напрямую, но он не соответствует каталогу в распространяемом веб-приложении.

2 голосов
/ 12 июля 2011

Я бы порекомендовал открыть каталог на сервере с помощью вашего HTTP-демона (возможно, Apache), а затем написать приложение. Насколько я знаю, вы не можете писать файлы в вашей WAR / EAR.

1 голос
/ 12 июля 2011

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

Сначала определите, как и где вы будете развертывать приложение (если это военный файл, у вас даже не будет корневого каталога), а затем соответственно разработайте свое приложение.

Если вы хотите оставаться переносимым, вы должны определить параметр конфигурации (в вашем web.xml), определяющий, где хранятся внешние файлы, и иметь сервлет, считывающий файлы из этого каталога и записывающий их содержимое в поток вывода ответа.

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

0 голосов
/ 12 июля 2011

Вот мое решение в методе сервлетов doGet (...).Он не сохраняет RSS в файловой системе, он будет создаваться каждый раз (при наличии запроса).Я записываю его как ответ HTTP.

response.setContentType("application/rss+xml");
response.setHeader("Cache-Control", "no-cache"); // HTTP 1.1
response.setHeader("Pragma", "no-cache"); // HTTP 1.0
response.setDateHeader("Expires", 0); // prevents caching at the proxy server

PrintWriter out = response.getWriter();
out.print("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
[...]
out.print("</xml>");
out.flush();
out.close();
// set header information

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

String absoluteFilesystemPath = getServletContext().getRealPath("/");
System.out.println(absoluteFilesystemPath);
File f = new File(absoluteFilesystemPath+"file.xml")
0 голосов
/ 12 июля 2011

То, что Джастин говорит, правильно, но я бы пошел дальше и сказал, что вам действительно нужно хранить его на диске?

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

...