Ответ 1
Вы пишете файл прямо в папку проекта IDE, и ваше намерение, похоже, сохраняет файл в папке развертывания webapp. Это плохая идея и хорошо из-за следующих 3 основных причин:
-
Изменения в папке проекта IDE не сразу отражаются в рабочей папке сервера. Там есть фоновая работа в среде IDE, которая заботится о том, чтобы рабочая папка сервера синхронизировалась с последними обновлениями (это в терминах IDE, называемых "публикация" ). Это основная причина проблемы, которую вы видите.
-
В коде реального мира существуют ситуации, когда сохранение загруженных файлов в папке развертывания webapp не будет работать вообще. Некоторые серверы (по умолчанию или по конфигурации) не расширяют развернутый WAR файл в локальную файловую систему на диске, а полностью заполняют память. Вы не можете создавать новые файлы в памяти без основного редактирования развернутого WAR файла и его повторного развертывания.
-
Даже когда сервер расширяет развернутый файл WAR в локальную файловую систему на диске, все вновь созданные файлы теряются при повторном развертывании или даже простом перезапуске, просто потому, что эти новые файлы не являются частью исходной WAR файл.
Вместо этого вам нужно записать его на фиксированный путь вне каталога проекта/развертывания. Например, /var/webapp/uploads
. Затем, чтобы заставить его обслуживать ваш webapp, просто добавьте его как новый контекст веб-приложения на сервер.
Исходя из вашего предыдущего вопроса, я знаю, что вы используете Glassfish 3.1. На этом сервере он называется "виртуальным хостом". Вы можете настроить его на уровне сервера в консоли администратора на http://localhost:4848 > Конфигурация > Служба HTTP > Виртуальные серверы или на уровне webapp, добавив следующая строка в /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>
.
См. также:
- Как загрузить файлы на сервер с помощью JSP/Servlet?
- Рекомендуемый способ сохранения загруженных файлов в приложении сервлета (содержит пример конфигурации Tomcat)
- Чтение/запись текстового файла в сервлет, где этот файл должен храниться в JBoss? (содержит пример конфигурации JBoss)
- Простейший способ обслуживания статических данных вне сервера приложений в веб-приложении Java