Anexos - Como recuperar arquivos no servidor

Olá pessoal, tudo bem?

Estou desenvolvendo um sistema de chamados (help desk) web em jsp, servlet, jdbc e mvc para a empresa onde estou trabalhando.
Cheguei na parte do usuário enviar o anexo. A parte do upload está funcionando corretamente com o FileUpload. Para cada chamado, eu crio um diretório dentro de uma pasta com o id do chamado e coloco os arquivos lá.

Até que a parte do usuário fazer o download dos arquivos está funcionando, porém, não sei se desenvolvi da melhor maneira.
Atualmente, eu crio o link referenciando essa pasta no servidor. Algo bem grotesco mesmo. Exemplo:

Para o chamado 1234, recuperar relatorio.pdf

helpdesk/anexos/1234/relatorio.pdf

Essa é a melhor forma de trazer os arquivos para download?

Tem 2 formas básicas para se fazer isso:

  1. gerenciar os arquivos no banco
  2. gerenciar os arquivos dentro do sistema de diretórios no servidor

Eu prefiro a opção 2 por evitar cargas, gastos com banco de dados, memoria JVM etc…Mas dependendo do caso os arquivos podem ser tão pequenos com um volume de acesso tão baixo que não faz diferença entre. A opções 2 é mais escalável!

Unico problema do seu caso é que os seus arquivos estão dentro do contexto do WAR…qualquer problema vc perde os arquivos…eu aconselho a colocar em uma pasta fora do servidor para que possa ser gerenciado independente da aplicação. Isso da um flexibilidade maior…

Olá Fernando, primeiramente, obrigado pela ajuda!

A minha maior dúvida é como eu vou recuperá-los. Qual a melhor maneira de trazer os arquivos pro usuário.
Acho muito grosseiro montar o link pro arquivo, como se fosse html puro.

E outra, se os arquivos não ficarem no mesmo contexto da aplicação, não é possível fazer desta forma não é mesmo?!

O que você me sugere?

Ah, a respeito do banco, eu estou guardando o caminho e não o arquivo. Também prefiro essa implementação porque não pesa a aplicação.

Te sugiro oq eu venho fazendo há anos com sucesso:
*) Crie uma pasta no seu servidor jee
*) parametrize o path desse endereço via sofcode.
*) grave no banco de dados o nome e endereço relativo.
*) Meus arquivos tem restrições de segurança por isso não deixo eles abertos via links.
*) O download é feito atraves de processos usando ServletOutputStream, independente de framework MVC.

É claro que seu cenário e requisitos forem diferentes, vc pode variar um pouco a solução…

[quote=FernandoFranzini]Te sugiro oq eu venho fazendo há anos com sucesso:
*) Crie uma pasta no seu servidor jee
*) parametrize o path desse endereço via sofcode.
*) grave no banco de dados o nome e endereço relativo.
*) Meus arquivos tem restrições de segurança por isso não deixo eles abertos via links.
*) O download é feito atraves de processos usando ServletOutputStream, independente de framework MVC.

É claro que seu cenário e requisitos forem diferentes, vc pode variar um pouco a solução…[/quote]

Fernando, deu pra dar uma clariada aqui!

Eu sou relativamente novo em programação web e estou caminhando no aprendizado. Por isso, não estou utilizando nenhum framework, justamente no intuito de aprender.

Você citou sofcode. Eu pesquisei aqui no google e não achei nada a respeito. Teria como você colocar o exemplo da arquitetura que você utilizou aí nos seus projetos? Meu intuito de maneira nenhuma é copiar o seu código, é de apenas aprender a melhor forma de desenvolver.

Desde já, muito obrigado pela sua ajuda!

veja - http://en.wikipedia.org/wiki/Softcoding
Em java usamos XML.
Não tem como eu te mostrar pq é muito código…
Seria mais ou menos:

  • No upload do arquivo eu o salvo nesse endereço fora do servidor (/home/aplicacao/), gravando o nome e/ou endereço relativo dentro SGDB.
  • Quando o usuraia quer ver o arquivo, eu vou nesse lugar e pego o arquivo via File e envia na resposta HTTP…