Загруженное изображение доступно только после обновления страницы
Когда я загружаю изображение, файл успешно сохраняется, и путь успешно установлен. Но загруженное изображение не отображается сразу после отправки формы. Только когда я перезагружаю страницу, загруженное изображение отображается.
Я сохраняю загруженный файл, как показано ниже:
InputStream is;
try {
File file = new File("C:\\****\\*****\\Documents\\NetBeansProjects\\EventsCalendary\\web\\resources\\images\\uploadPhoto.png");
is = event.getFile().getInputstream();
OutputStream os = new FileOutputStream(file);
setUserPhoto("\\EventsCalendary\\resources\\images\\"+file.getName());
byte buf[] = new byte[1024];
int len;
while ((len = is.read(buf)) > 0) {
os.write(buf, 0, len);
}
os.close();
is.close();
} catch (IOException ex) {
System.out.println(ex.getStackTrace());
}
Почему загруженное изображение отображается только после перезагрузки страницы и как я могу решить эту проблему?
1 ответ
Вы записываете файл прямо в папку проекта IDE, и ваше намерение сохранить файл в папке развертывания веб-приложения. Это плохая идея и хорошо по следующим 3 основным причинам:
Изменения в папке проекта среды 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>
обычный способ.
Смотрите также:
- Как загрузить файлы на сервер, используя JSP/Servlet?
- Рекомендуемый способ сохранения загруженных файлов в приложении сервлета (содержит пример конфигурации Tomcat)
- Чтение / запись текстового файла в сервлете, где этот файл должен храниться в JBoss? (содержит пример конфигурации JBoss)
- Самый простой способ обслуживания статических данных извне сервера приложений в веб-приложении Java