Pegar caminho de arquivo no servidor usando Servlet

14 respostas
C

Iai pessual, to com uma duvida meio chata, e ñ to encontrando uma solução aki…

seguinte…tenho uma classe q busca um arquivo…

em alguns métodos tenho linhas de código parecidas com essa:

File file = new File("src\\java\\securityResources"); String path = file.getAbsolutePath() + "\\" + certificado;

finalizei a app de teste q estava fazendo desktop…porem essa classe será usada em aplicações web.
A duvida é: como pegar o caminho correto do arquivo no servidor, sem ter q transformar essa minha classe em servlet?..alguem ai manja?

vlw

14 Respostas

T

da uma olhada neste link , acho que pode te ajudar

http://commons.apache.org/net/

C

vc pode me dar um exemplo de como essa API pode me ajudar?
vlw

C

Iai pessual, to com sérios problemas pra resolver isso... :shock: ....nem sei como resolver...

estava pensando na possibilidade de criar um servlet q pega o caminho através do seguinte:

package br.com.cienci.nfe.servlets;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class PathServlet extends HttpServlet {
 
    public String getPath(){
        return getServletContext().getRealPath("/securityResources");
    }
}

mas não sei se isso funcionaria...a duvida é:

é possivel chamar a servlet dentro de uma classe?...de modo q eu pegue o path do diretorio "securityResources"..

se alguem puder ajudar agradeço mto..
vlw

T

Uma Servlet é uma classe comum que é filha de HttpServlet entao acredito que se vc instanciar um objeto da sua classe Servlet
deve funcionar.

nos dois links abaixo tem exemplos de como usar a api sugerida , mas tudo depende de que se vc nao fizer uma classe Servelet como vai se conectar ao servidor para pegar o caminho dos arquivos.
Da uma lida tambem no javadoc que tem no link da api

http://www.informit.com/guides/content.asp?g=java&seqNum=40
http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3

C

eu ja instanciei pra ver...e da erro:

package br.com.cienci.nfe.servlets;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class PathServlet extends HttpServlet {
 
    public String getPath(){
        return getServletContext().getRealPath("/securityResources");
    }
}
package br.com.cienci.nfe.util;

import br.com.cienci.nfe.servlets.PathServlet;

public class TesteUrl {

    public static void main(String[] args){        
        PathServlet pp = new PathServlet();
        System.out.println("Path: " + pp.getPath());
    }
}
Exception in thread "main" java.lang.NullPointerException
        at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)
        at br.com.cienci.nfe.servlets.PathServlet.getPath(PathServlet.java:21)
        at br.com.cienci.nfe.util.TesteUrl.main(TesteUrl.java:17)
Java Result: 1

pq será?...é pq ele não ta indo no server ou algo assim?...tem alguma maneira de eu chamar pela url-pattern dela?

flw

T

neste seu exemplo quem esta dando erro é o metodo getServeletContext() que esta retornando nulo
e nao instanciar ou chamar um metodo da servlet

C

sim, isso eu percebi…mas pq isso acontece?..tem algum jeito disso não ficar nulo?..pq se eu conseguisse retornar o path, acho q resolveria meu problema…

flw

J

cara,
esse codigo não vai funcionar simplesmente pq o metodo getServletContext() retorna o contexto dentro do server.
vc nao poder invocar esse metodo dessa maneira.

mas eu na netendi o que vc ta querendo fazer. vc quer ler o arquivo?

[]´s

C

jgbt:
cara,
esse codigo não vai funcionar simplesmente pq o metodo getServletContext() retorna o contexto dentro do server.
vc nao poder invocar esse metodo dessa maneira.

mas eu na netendi o que vc ta querendo fazer. vc quer ler o arquivo?

[]´s

eu suspeitei desde o principio…kkk… :smiley:

mas brincadeiras a parte, meu problema é bem chato pra dizer a verdade.
Eu tenho alguns arquivos (xsd, certificados digitais, keystore,…) que eu preciso carregar na aplicação. Em desktop eu usava normal:

File file = new File("src\\securityResources"); String path = file.getAbsolutePath() + "\\" + certificado;

mas na web eu não to conseguindo pegar esse arquivo…fiz alguns testes e me da um erro como:

java.io.FileNotFoundException: file:\C:\Arquivos de programas\Apache Software Foundation\Apache Tomcat 6.0.14\bin\src\java\securityResources\certificado_rns.p12 (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:106) at java.io.FileInputStream.<init>(FileInputStream.java:66) at br.com.cienci.nfe.signature.DigitalSignature.sign(DigitalSignature.java:74) at br.com.cienci.nfe.rfc.ConsultaCnpjWs.getIncricaoMunicipal(ConsultaCnpjWs.java:41) at br.com.cienci.nfe.rfc.RFCServer$Server.handleRequest(RFCServer.java:152) at com.sap.mw.jco.JCO$Server.dispatchRequest(JCO.java:5409) at com.sap.mw.jco.rfc.MiddlewareRFC$Server.nativeListen(Native Method) at com.sap.mw.jco.rfc.MiddlewareRFC$Server.listen(MiddlewareRFC.java:1010) at com.sap.mw.jco.JCO$Server.listen(JCO.java:5205) at com.sap.mw.jco.JCO$Server.run(JCO.java:5139) at java.lang.Thread.run(Thread.java:619)

eu não entendo pq ele vai no diretorio bin do tomcat…o esperado era pegar o arquivo no diretorio onde esta a aplicação…

alguma sugestão?..qualquer coisa é bem vinda… :smiley:
vlw

J

ele so vai achar arquivos que estejam no CLASSPATH.

o mais simples p/ ele ler um arquivo seria colocar ele no mesmo diretorio da classe e :

InputStream in = this.getClass().getResourceAsStream("nome do arquivo");

[]´s

J

jgbt:
ele so vai achar arquivos que estejam no CLASSPATH.

o mais simples p/ ele ler um arquivo seria colocar ele no mesmo diretorio da classe e :

InputStream in = this.getClass().getResourceAsStream("nome do arquivo");

[]´s

Ou então, se estiver dentro do WEB-INF/classes, pode usar o seguinte

InputStream is = getClass().getClassLoader().getResourceAsStream("nome do arquivo");
C

jgbt:
ele so vai achar arquivos que estejam no CLASSPATH.

o mais simples p/ ele ler um arquivo seria colocar ele no mesmo diretorio da classe e :

InputStream in = this.getClass().getResourceAsStream("nome do arquivo");

[]´s

iai cara, blz?

aparentemente resolveu meu problema dessa forma, porem os arquivos devem ficar no msm package…tem como eu somente pegar esse caminho, e assim depois trabalhar com essa String para pegar um outro package?

alem disso, em outra situação eu preciso fazer o seguinte:

System.setProperty("javax.net.ssl.keyStore", this.privateKey);

onde esse this.privateKey é o arquivo a ser setado, ou seja, o caminho inteiro do arquivo…então nesse caso eu preciso de uma String msm, tem alguma forma?..pois não posso passar um InputStream nesse caso

flw…e vlw a ajuda

A

Caso alguem precise…
String path = ClassLoader.getSystemResource(“arquivo”).getPath();

L

Grande Rapaziada,

Estou com um probleminha, pode ate ser besta…mais nao estou conseguindo resolver…

Estou fazendo o upload de uma imagem e gravando em um diretorio(Comum) na raiz do meu servidor.
Ate aqui tranquilo.

Mais depois quero que o meu jsp o comando html (<IMG SRC=’’) mostre essa imagem no browser, nao estou conseguindo fazer isso.

alguem tem alguma sugestão?

obrigado.

Criado 16 de outubro de 2008
Ultima resposta 28 de jan. de 2010
Respostas 14
Participantes 6