Acessar um arquivo no servidor

11 respostas
jesley.sena

Senhores,

como eu faço para instanciar um arquivo que está no SERVIDOR de dentro da minha JSP (SEI QUE ISSO FEIO, MAIS É PROVA DE CONCEITO).

Estou tentando o seguinte:

<% File arquivo = new File("http:\\\\localhost:8080\\sar\\ajuda\\exibir\\sarfw0880.jsp"); %>
Só que ao rodar a aplicação eu tomo o seguinte erro:

[ServletException in:/modelos/modelo.jsp] http:\localhost:8080\sar\ajuda\exibir\sarfw0880.jsp (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)'

Percebam que a url foi alterada, o meu http ficou apenas com UMA BARRA.

Eu fiz o teste com um arquivo na minha máquina e deu certo, mas recuperando um arquivo do servidor não estou conseguindo.

Aguardo o retorno.

11 Respostas

ivandasilva

Use a barra ‘/’ assim você não precisa ficar anulando a barra com ‘\’

ctdaa

Você está usando o construtor de File com atributo String:

Porque não tenta com atributo URI:

jesley.sena

Já fiz vários testes com as barras, tanto uma quanto outra.
Dá no mesmo. O contâiner sempre come uma barra.

Tentei usar a classe URI

File arquivo = new File(URI.create("http://localhost:8080/sar/ajuda/exibir/sarfw0880.jsp"));

Mas quando eu uso eu tomo o seguinte erro

URI scheme is not "file"

ivandasilva

Cara eu fiquei curioso e testei aqui, você vai poder colocar quantas barras quizer que não vai conseguir…

obs se é de dentro do seu servidor coloque o caminho sem o http ou https.

ctdaa

Tem razão… usando URI com http: dá este erro. Você precisa mesmo instanciar File. Se quiser somente ler o conteúdo pode fazer assim:

try {
                URL url = new URL("http://localhost/Index.htm");
                BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
                String s;
                while ((s = br.readLine()) != null) {
                        System.out.println(s);
                }
                br.close();
        } catch (MalformedURLException excecao) {
                excecao.printStackTrace();
        } catch (IOException excecao) {
                excecao.printStackTrace();
        }
jesley.sena

Fui cortando estilo Jason sexta-feira 13:
Sem o http://

Erro 1 HTTP Status 404 - localhost:8080\sar\ajuda\exibir\sarfw0880.jsp (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)

Sem o nome do contexto

Erro 2 HTTP Status 404 - \sar\ajuda\exibir\sarfw0880.jsp (O sistema não pode encontrar o caminho especificado)
E por aí vai…
Nenhuma das tentativas obtive sucesso.

Mais alguma idéia.

ivandasilva

Cara um exemplo em J2SE que você com certeza vai poder implementar no seu JSP…

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Arquivo {

    public static void main(String... x) throws MalformedURLException, IOException {

        URL url = new URL("http", "localhost", 8080, "/cvrd/index.jsp");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        InputStream is = urlConnection.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        String line = br.readLine();
        StringBuffer sb = new StringBuffer();

        while (line != null) {

            sb.append(line.concat("\n"));

            line = br.readLine();

        }

        System.out.println(sb.toString());
    }
}
ivandasilva

Fonte legal…

http://java.sun.com/docs/books/tutorial/networking/urls/readingWriting.html

jesley.sena

Perfeito meu chapa,

quase consegui. só que ao invés de abrir a página que eu passo a aplicação abre a jsp de login.
A aplicação me jogou direto para o login, eu faço a segurança declarativa no meu WEB.XML mas o usuário com que eu me loguei tem visibilidade para essa pasta.
Será que tem como passar o usuário e senha para a classe URL ou HttpURLConnection?

Continuo na trilha.

jgbt

Se vc fizer acesso via URL vc vai sempre cair na sua validação.
Para o seu servidor é uma requisição HTTP, nao importa se quem gerou foi um browser ou outro tipo de aplicação.

Se vc quiser acessar a URL com user/pass:
http://www.exampledepot.com/egs/java.net/Auth.html

Pq vc não mapeia esse diretorio e acessa como um File qualquer?

[]´s

jesley.sena

Rapaziada eu peguei o código que fazia leitura na jsp e movi para a Action.
Eu utilizei o post do jgbt

http://www.exampledepot.com/egs/java.net/Auth.html

Mais continuo sendo jogado para a tela de login ao tentar ler um arquivo a partir da URL.

String caminho = 	request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath() + 
    		"/ajuda/exibir/" + nomeArquivo;
Authenticator.setDefault(new MyAuthenticator());
URL url = new URL(caminho);  
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
 String str;
while ((str = in.readLine()) != null) {
        System.out.println(str);
}
in.close();

Esse código funciona blz, só que o arquivo que é escrito no console é a JSP DE LOGIN DA MINHA APLICAÇÃO.

Jgbt, como é que faz esse mapeamento do diretório que você falou?

Pq vc não mapeia esse diretorio e acessa como um File qualquer?

Obrigado rapaziada.

Continuo na trilha.

Criado 10 de dezembro de 2009
Ultima resposta 15 de dez. de 2009
Respostas 11
Participantes 4