Вы записываете файл прямо в папку проекта IDE, и ваше намерение сохранить файл в папке развертывания веб-приложения.Это плохая идея, и в силу следующих трех основных причин:
Изменения в папке проекта среды IDE не сразу отражаются в рабочей папке сервера.В IDE есть своего рода фоновое задание, которое заботится о том, чтобы рабочая папка сервера синхронизировалась с последними обновлениями (это в терминах IDE, называемых «публикацией»).Это основная причина проблемы, с которой вы сталкиваетесь.
В реальном коде существуют ситуации, когда сохранение загруженных файлов в папке развертывания веб-приложения вообще не будет работать.Некоторые серверы (по умолчанию или по конфигурации) не раскрывают развернутый файл WAR в файловой системе локального диска, а полностью в памяти.Вы не можете создавать новые файлы в памяти, не редактируя развернутый WAR-файл и не перераспределяя его.
Даже когда сервер развертывает развернутый файл WAR в файловую систему локального диска, всевновь созданные файлы будут потеряны при повторном развертывании или даже при простом перезапуске просто потому, что эти новые файлы не являются частью исходного файла WAR.
Вам необходимо записать его по фиксированному путиза пределами папки проекта / развертывания.Например, /var/webapp/uploads
.Затем, чтобы ваше веб-приложение обслуживало его, просто добавьте его в качестве нового контекста веб-приложения на сервер.
Исходя из вашего предыдущего вопроса, я знаю, что вы используете Glassfish 3.1.На этом сервере он называется «виртуальный хост».Вы можете настроить его на уровне сервера в консоли администратора по адресу http://localhost:4848 > Конфигурация> Служба HTTP> Виртуальные серверы или на уровне веб-приложения, добавив следующую строку в /WEB-INF/glassfish-web.xml
(ваш IDEдолжен был сгенерировать один автоматически; обратите внимание, что этот файл до Glassfish 3.1 назывался sun-web.xml
, поэтому, если вы видите руководства / блоги / руководства, ссылающиеся на него, да, это точно тот же файл):
<property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp" />
ЛюбойКстати, вы сможете использовать http://localhost:8080/contextname/uploads/* для обслуживания загруженных изображений с помощью <img>
обычным способом.
См. Также: