FileInputStream no FTPClient

12 respostas
M

Pessoal, bom dia!

Sou novo aqui e no JAva. Peço uma ajuda.

Eu tô usando o FTPClient para fazer um upload. No localhost ele faz bonitinho. Lê o arquivo de entrada (que está no windows) e grava no servidor (que é linux). Quando eu subo a aplicação para o servidor dá erro. Ele não consegue ler o arquivo de entrada. Cai em IOException.

Alguém tem uma idéia?

o Código é simples:

String caminho = request.getParameter(“Arquivo”);
caminho = caminho.trim();

if (caminho != “”) {

LerArquivoTexto blocozero = new LerArquivoTexto();
                String arquivo = blocozero.ler0000Fiscal(caminho);

                caminho = caminho.replace("\\", "/");

               //caminho --> entrada
               //arquivo --> saida
	            
              FTPClient ftp = new FTPClient();
              ftp.connect( "host" );
              ftp.login( "user", "senha" );
              ftp.changeWorkingDirectory ("ArquivosClientes");

              FileInputStream arqEnviar = new FileInputStream(caminho);
            
              ftp.storeFile(arquivo, arqEnviar);
	            
              ftp.disconnect();
             arqEnviar.close();

}
Obrigado

12 Respostas

ViniGodoy

E o que a IOException diz? O texto dela geralmente explica qual foi o problema.

M

Vini, bom dia

Quando a aplicação está no servidor ela simplesmente deixa a tela em branco. Não mostra o erro. Eu coloquei pra chamar qualquer página no catch do ioexception e a página foi chamada. Por isso sei que é essa a exception.

O que eu tô pesquisando (e ainda não encontrei uma resposta) é que de alguma forma eu preciso especificar para o fileinputstream que o arquivo de entrada é no cliente e não no servidor que está hospedado.

Quando estou no localhost a relação é: arquivo de entrada local e saída remoto.

Mas com a aplicação no servidor, será que não preciso inverter? o local é o servidor e o remoto é o cliente? Será que não é ai que tô errando?

Teria diferença para o ftpclient quando o upload parte do cliente para o servidor e quando parte do servidor para a cliente?

ViniGodoy

Primeiro dê um jeito de melhorar seu servidor para capturar e logar as exceptions não capturadas. Ou você terá problemas sérios com a manutenção do seu sistema.
Depois, leia o texto da sua exception, e veja o que ele diz.

Programar no achismo é uma péssima prática. Você até pode mudar coisas por tentativa e erro até achar o problema, mas leva muito mais tempo e dá muito mais trabalho.

ViniGodoy

Espere aí, como vc sobe a aplicação para o servidor, e como vc faz para dispara-la? É uma aplicação socket? Ou web? Ou um applet? Ou JNLP?

Applets não podem ler dados nas máquinas clientes, a menos que o cliente os autorize.
Seria bom vc escrever um manifesto completo no JNLP solicitando esse tipo de permissão de segurança.

M

Eu subo a aplicação via .war… exporto do eclipse e subo para o servidor.

É uma aplicação WEB. Quem chama é o cliente. Só que, como a classe está no servidor, minha dúvida é como ela interpreta o que é cliente e o que é servidor.

Se estou no localhost e chamo a aplicação, ele faz o ftp correto e entende o diretório de entrada, por que, apesar de simular uma aplicação web, fisicamente o servidor está na própria máquina.

O problema é que, se a aplicação está no servidor e eu executo pelo cliente, quando faz o fileinputstream “c:\diretorio\arquivo” acredito que deva estar buscando no diretório do servidor e não do cliente.

Vou ligar para a kinghost, onde está hospedado, para ver como faz para jogar o erro na tela.

Obrigado e se tiver uma idéia, por favor, me dê uma luz…

M

Consegui ver o log no servidor e o erro é ele não achar o arquivo … ele deve procurar no servidor:

java.io.FileNotFoundException: C:\Arquivos\[telefone removido].txt (No such file or directory)

at java.io.FileInputStream.open(Native Method)

at java.io.FileInputStream.(FileInputStream.java:106)

at java.io.FileInputStream.(FileInputStream.java:66)

at br.com.getresults.arquivoTexto.LerArquivoTexto.ler0000Fiscal(LerArquivoTexto.java:8)

at br.com.getresults.servlet.ImportSpedFiscal.doGet(ImportSpedFiscal.java:33)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)

at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)

at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)

at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)

at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)

at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)

at java.lang.Thread.run(Thread.java:619)
ViniGodoy

O FileInputStream sempre irá se referir a máquina onde ele roda, no caso o servidor. Se vc quiser usar um arquivo do cliente, terá que envia-lo via post para o servidor, para só depois abri-lo. Não tem como simplesmente abrir um InputStream no cliente (graças a Deus, imagina se qualquer site pudesse sair lendo arquivos que estão na sua máquina).

M

Eu não quero ler o arquivo no cliente. Quero simplesmente fazer uma operação de Upload, em que o cliente especifica o arquivo que quer enviar e eu faço um FTP. Como a aplicação está no servidor e é invocada no cliente (via browser), eu preciso somente saber como faço para informar as classes do java para pegar o arquivo especificado pelo cliente (na máquina do cliente) e jogá-lo no servidor.

Se a aplicação é rodada pelo cliente não se trata do servidor sair lendo qualquer máquina. A ação do cliente vem com o aceite implícito de acesso a máquina dele, pois o aplicativo terá regras de acesso, etc…

Mas você citou enviar via post para o servidor, talvez, seja ai a solução. Como disse, sou novo no mundo do JAva(web) e não conheço determinados macetes para fazer determinadas operações.

Vou pesquisar sobre o que disse. Se, não lhe incomodar, e tiver algum exemplo, será de grande valia.

grato

nextuser
InputStream input;

                input = new FileInputStream(local);

                ftp.storeFile(remote, input);

                input.close();


//////

                OutputStream output;

                output = new FileOutputStream(local);

                ftp.retrieveFile(remote, output);

                output.close();
M

Hudson,

Obrigado pelo envio do exemplo, mas não é isso.

A página .JSP com a tag do input type"file" até abre a estrutura do cliente, mas a hora que passo parâmetro para classe que vai ler o arquivo de entrada (no cliente) e jogar para o servidor, o fileinputstream não lê a estrutura do cliente e sim do servidor, onde estoura a exception do filenotfound

Eu preciso, de alguma forma, setar para o ftp.storeFile que o arquivo source não está no servidor e sim no cliente e o InputStream input deu na mesma. O Tomcat soltou o mesmo erro…

Vou continuar na pesquisa … se, por acaso, ver onde tem uma suposta resposta para meu problema, eu agradeço a ajuda!

Abraços

nextuser

vc tem que fazer upload para o server primeiro depois mandar para o ftp…

M

eu tô achando que o ftp é a opção de enviar do client para o server …

Se eu tenho de fazer upload primeiro, não preciso, sequer, do ftp …ou preciso?

Eu so quero fazer o upload … só isso … fiz uma tela, que abre a estrutura de diretório no cliente, o cliente vai selecionar o arquivo, clicar num botão que vai disparar uma classe java, que, por sua vez, vai pegar o arquivo selecionado e enviar para o servidor …

Só que o aplicativo é via web … a classe tá no server … e eu preciso fazer essa bendita classe enxergar o arquivo no cliente…

Pode ser com qualquer biblioteca, desde que ela me dê opção de falar: source no cliente, target no server…

Seria a FileUpload ?

abs e obrigado

Criado 24 de abril de 2011
Ultima resposta 24 de abr. de 2011
Respostas 12
Participantes 3