Como utilizar uma pasta de arquivos fora do escopo do projeto no tomcat?

Como utilizar uma pasta de arquivos fora do escopo do projeto no tomcat?

Exp:

tomcat8->webapps->myProject->project
tomcat8->webapps->files-myProject-> *.pdf, *.jpg

Espero que dê pra entender.

Conto com a coloboração.

Obg.

Você pode colocar seus arquivos que não devem ficar públicos na pasta /webapps/projeto/WEB-INF.
Esses arquivos poderão ser acessados somente através das suas classes, ou seja, para alguém de fora acessar vai ter que passar por um Servlet, que vai validar a autenticação e carregar o arquivo.

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");
//OU
InputStream resourceContent = context.getResourceAsStream("/WEB-INF/test/foo.txt");
1 curtida

Obrigado Guilherme por sua resposta, mas eu queria que a pasta fosse fora do escopo do projeto, e que pudessem ser acessados pelas classes sim para eu fazer o controle das mesma. Se puder dar uma dica de como fazer isso!

Você pode capturar o diretório raiz onde a aplicação está rodando assim:

final String context = config.getServletContext().getRealPath("/");

Você poderia fazer o seguinte para acessar um arquivo numa pasta anterior:

File file = new File(context + "../../files");

Para colocar os arquivos fora da pasta do Tomcat, você poderia definir uma variável de ambiente (ex. “TOMCAT_FILES_DIR”) com o caminho absoluto e capturá-la na sua aplicação:

TOMCAT_FILES_DIR = D:\tomcat\webapps-files\

	String filesDirectory = System.getenv("TOMCAT_FILES_DIR");
	File file = new File(filesDirectory + "pdfs/foo.pdf");

Sugiro o uso de uma variável de ambiente porque no ambiente de desenvolvimento e de produção a estrutura de pastas pode ser diferente.

Quando é para acesso a um resource externo ao servidor eu prefiro utilizar diretórios virtuais no tomcat, aqui explico como fazer, abraços.

Configurando Diretório Virtual no Tomcat

Ex: dos arquivos de configuração

Se por acaso tentar e não obter sucesso, diz ai, abraços.

@aix Desse jeito fica muito bom também, mas as imagens ficariam acessíveis a todos, certo?

@Guilherme_Passer também concordo, acho que os arquivos ficariam acessíveis por todos, o que prejudica a segurança, e como evitar isso @aix ???

Sim é um diretório de acesso público mas acho que tem como barrar acessos, dentro do context do manager tem uma tag Valve, no caso deste exemplo diz que permite para tal endereço de rede, podia ver na doc se tem acomo aplicar a este seu caso, claro dependendo de qual é o tipo de bloqueio que busque, mas se são só imagens vc não deveria ter problemas.

<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1" />

@aix, eu estou utilizando jsp, nao entando nao consegui com o seu metodo, porém @Guilherme_Passer eu tentei implementar o metodo utilizando a variavel de ambiente HOME para implementar o diretório e não deu certo para apresentar o arquivo.

ficou assim

porem o frame nao apresenta a imagem

:frowning:

Poderiam me ajudar?

mas funciona, esta na documentação e eu utilizo a muito tempo, nunca deu problema, provável que você tenha configurado errado o que é bem normal na primeira vez.

Qual IDE esta usando?
Qual a versão do tomcat ?
Qual sistema operacional?

Ficou assim como? Acho que faltouum anexo.
O sistema está conseguindo carregar a variável HOME? O arquivo está vindo nulo?

Então @aix quer dizer o seu método funciona no jsp?

E @Guilherme_Passer faltou mesmo o anexo!

Estou conseguindo sim ver a vairavel HOME, ela me traz o diretorio raiz, com isso eu concateno com o resto do diretorio até chegar no diretoria de arquivos que estou querendo, porém quando coloco o mesmo diretório para abrir um .pdf em um frame, a página não consegue carregar o arquivo.

iframe width=“850” height=“500” src=“f/home/nikolas/workspace/dataged-files/files-ged/ged-25-862331872945071274.pdf”

@Nikolassoares84 você não pode enviar para o navegador um diretório do servidor. Você precisa tratar o carregamento do arquivo no servidor. Sugiro fazer o seguinte:

“src=“arquivo/ged-25-862331872945071274.pdf””

Esse caminho “arquivo” na verdade se refere a um servlet (mapeamento no web.xml). Você captura o conteúdo da string do GET no servlet “ArquivoDownloadServlet”, verifica se o usuário logado tem acesso, e envia o arquivo na resposta da requisição. Para o usuário fica transparente, é como se ele estivesse acessando diretamente um arquivo num diretório do servidor.
Aqui tem detalhes da implementação: http://respostas.guj.com.br/11655-servlet-para-download-de-imagens