5
respostas

Tomcat apaga as imagens quando reiniciado

Olá,

Estou conseguindo trabalhar com as imagens e caminhos relativos sem problemas, porém, quando reinicio o servidor, algumas vezes os arquivos de imagens são apagados do projeto (pasta dentro do TomCat) e, embora o caminho salvo continue correto no banco de dados, como a imagem foi apagada, não aparece mais no navegador.

Como posso evitar isso? Em produção seria um problema grave. Obrigado

5 respostas

Olá Francesco, tudo bem ?

Vamos lá. As imagens que você se refere são as imagens adicionadas dinamicamente, por alguma funcionalidade da aplicação ? Elas são salvas durante a execução da aplicação em alguma pasta dentro do server, e você adiciona o caminho na base de dados ? Só pra confirmar ..

De qualquer maneira, as imagens que devem ficar na pasta do tomcat são apenas os arquivos estáticos necessários para apresentação nas páginas, por exemplo. Idealmente as imagens que são frutos de uploads pela aplicação devem ser salvas em alguma outra pasta do host, ou até mesmo transferidas a algum servidor de arquivos que a aplicação tem acesso. Isso é recomendado justamente por causa dessas eventualidades que ocorrem como rodar scripts de restart, deploy e etc que reconstroem o diretório de acordo com o padrão.

Quando você instalou o servidor (tomcat) pelo plugin do eclipse, você fez alguma configuração para que o plugin tome controle da pasta de instalação do servidor ? Quando não configurado isso o eclipse cria os recursos em pastas internas temporárias o que pode também causar esse tipo de problema. É simples verificar isso clique duas vezes no servidor (aba Servers) e verifique se está marcada a opção Use Tomcat installation (takes control of Tomcat installation) na área Server Locations. Se não estiver marcado, e o server já foi iniciado, não será possível alterar, a menos que remova o servidor, e instale novamente marcando essa opção antes de adicionar a aplicação e iniciá-lo.

Dê uma olhada nisso. Caso ainda tenha problemas poste aqui o que aconteceu que a gente tenta ajudar. Espero ter ajudado. Abraço!

Rafael Obrigado.

O meu caso são as imagens adicionadas dinamicamente por uma funcionalidade da aplicação.

Eu pensei em colocar em uma outra pasta fora do tomcat, como sugeriu, vou ter que colocar em uma pasta no host. Porém, como faria pra mostrar na página? Quando gravo com o endereço relativo, posso colocar o endereço do arquivo para exibir. Se eu colocar em uma pasta fora do tomcat (fora do webapp), como faria? Teria que ficar copiando da pasta externa para a pasta do tomcat para poder exibir a imagem na minha página?

estou exibindo as imagens desta forma, utilizando o endereço na forma:

http://localhost:8080/casadocodigo/produtos/1/imagens/livro.png

para cada:

<img width="200px" height="200px" src="${produto.imagemPath }" />

Obrigado

Fala Francesco, tudo certo ?

Então. Se salvar fora da pasta webapp do tomcat fica difícil acessar nas páginas, visto que fora dessa pasta os recursos não são visíveis via navegador (não tinha ideia que estava acessando as imagens nas páginas depois de salvar =/). A não ser que essa pasta do host esteja servindo arquivos, gerando urls publicas etc (como um servidor de arquivos), o que seria o ideal pensando em um sistema em produção.

Como não é tao simples gerenciar mais um servidor para servir os arquivos no seu ambiente de desenvolvimento, tente ainda salvar na pasta do tomcat. Porém tente fazer com o eclipse tome controle da pasta de instalação do tomcat para não ter problemas com as pastas temporárias do wtp.

Rafael obrigado.

Já havia alterado o controle para o eclipse, do contrário nem consigo gravar na pasta wtp. Confesso que ainda estou meio perdido como trabalhar com arquivos, visto que pelo que li até agora, gravar como bytes no banco não seria o ideal. Estou mais preocupado com a produção mesmo, pois durante o desenvolvimento ela some, mas da pra fazer os testes. Porém, ainda estou achando meio obscuro, visto que nunca subi nenhuma aplicação na prática, exceto as do curso do alura no Heroku. Como no curso do Spring não mostra como é utilizado o sumário após a gravação do caminho relativo, fiquei tentando melhorar o código para alterarmos a imagem por uma página (a ideia era faze da mesma forma que alteramos fotos em redes sociais).

Obrigado mais uma vez

Opa Francesco,

Sua preocupação é de fato justa. No treinamento como o foco é explorar as classes do Spring MVC para abstrair as dificuldades do trabalho com Servlets foi feito uma implementação simples contando apenas com o próprio servidor web.

Você poderia testar por exemplo salvar em alguma outra pasta do host e ter algum controller/serviço que carrega um arquivo dessa pasta escrevendo o conteúdo dele no Response. Porém demandaria um tempo acima do esperado pra uma funcionalidade tão simples.

Em geral nos sistemas em produção o pessoal usa algum servidor de arquivos próprio ou serviço em nuvem pra hospedar esses arquivos gerando urls disponíveis para acesso direto pelos clientes web (um amazon s3, por exemplo).

Abraço!