Загруженное изображение доступно только после обновления страницы

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

Я сохраняю загруженный файл, как показано ниже:

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, и ваше намерение, похоже, сохраняет файл в папке развертывания 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>.

См. также: