Imagem carregada disponível somente após a atualização da página

Quando eu carrego uma foto, o arquivo é salvo com sucesso e o caminho é definido com sucesso. Mas a imagem enviada não é exibida imediatamente após o envio do formulário. Somente quando eu recarregar a página, a imagem enviada é exibida.

Estou salvando o arquivo enviado conforme abaixo:

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()); } 

Por que a imagem enviada é exibida somente depois de recarregar a página e como posso resolver isso?

Você está escrevendo o arquivo diretamente na pasta do projeto do IDE e sua intenção parece salvar o arquivo na pasta de implantação do webapp. Esta é uma má idéia e bem, devido aos 3 motivos principais a seguir:

  1. As alterações na pasta do projeto do IDE não são refletidas imediatamente na pasta de trabalho do servidor. Há um tipo de trabalho em segundo plano no IDE que cuida para que a pasta de trabalho do servidor seja sincronizada com as últimas atualizações (isso é em termos do IDE chamado “publicação”). Esta é a principal causa do problema que você está vendo.

  2. No código do mundo real, há circunstâncias em que o armazenamento de arquivos enviados na pasta de implantação da webapp não funcionará. Alguns servidores (por padrão ou por configuração) não expandem o arquivo WAR implementado para o sistema de arquivos em disco local, mas, em vez disso, estão totalmente na memory. Você não pode criar novos arquivos na memory sem basicamente editar o arquivo WAR implementado e reimplementá-lo.

  3. Mesmo quando o servidor expande o arquivo WAR implementado no sistema de arquivos do disco local, todos os arquivos recém-criados serão perdidos em uma reimplantação ou até mesmo uma reboot simples, simplesmente porque esses novos arquivos não fazem parte do arquivo WAR original.

Você precisa escrevê-lo para um caminho fixo fora da pasta project / deploy. Por exemplo, /var/webapp/uploads . Em seguida, para que ele seja exibido pelo seu aplicativo da Web, basta adicioná-lo como um novo contexto de aplicativo da Web ao servidor.

Com base na sua pergunta anterior, sei que você está usando o Glassfish 3.1. Neste servidor, é chamado de “host virtual”. Você pode configurá-lo no nível do servidor no console administrativo em http: // localhost: 4848 > Configuração> Serviço HTTP> Servidores Virtuais ou no nível do webapp adicionando a seguinte linha ao /WEB-INF/glassfish-web.xml ( seu IDE deve ter gerado um automaticamente, note que este arquivo é antes do Glassfish 3.1 chamado sun-web.xml , então se você está vendo manuais / blogs / tutoriais referenciando, sim é exatamente o mesmo arquivo):

  

De qualquer forma, você deve ser capaz de usar http: // localhost: 8080 / contextname / uploads / * para servir essas imagens enviadas por da maneira usual.

Veja também:

  • Como fazer upload de arquivos para o servidor usando JSP / Servlet?
  • A maneira recomendada para salvar arquivos enviados em um aplicativo de servlet (contém um exemplo de configuração do Tomcat)
  • Lendo / escrevendo um arquivo de texto em um servlet, onde este arquivo deve ser armazenado no JBoss? (contém o exemplo de configuração do JBoss)
  • Maneira mais simples de fornecer dados estáticos de fora do servidor de aplicativos em um aplicativo da Web Java
Intereting Posts