2011-05-08 22 views
21

Estoy tratando de hacer una carga de archivo MUY simple. Quiero un Java FTPClient que pueda cargar cualquier archivo que le indique. Pero el pdf siempre se descompone y mi editor de PDF (Adobe) no lo abre, diciendo que hay un error de E/S.FTPClient - Java, archivo de carga

estoy usando la clase siguiente:

import org.apache.commons.net.ftp.FTPClient; 
    .... 

    FTPClient client = new FTPClient(); 
    FileInputStream fis = null; 

    try { 
     client.connect("mydomain.com"); 
     client.login("user", "password"); 

     String filename = "myPDF.pdf"; 
     fis = new FileInputStream(filename); 

     client.storeFile("temp.pdf", fis); 
     fis.close(); 
     client.logout(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

¿Por qué no funciona, y cómo puedo solucionarlo?

+0

¿Has probado las respuestas a tu pregunta de hace media hora? http://stackoverflow.com/questions/5925438/url-connection-ftp-in-java-simple-question – Aleadam

+0

yup, estoy usando un FTPClient ahora. La pregunta es completamente diferente. – CodeGuy

Respuesta

23

No funciona porque el modo de transferencia predeterminado para FTPClient es FTP.ASCII_FILE_TYPE. Solo necesita actualizar la configuración para transferirla en modo binario.

+1

Para transferir en modo binario: 'ftp.setFileType (FTP.BINARY_FILE_TYPE)' – DLight

3

intenta utilizar BufferedInputStream, este es un (de trabajo) Ejemplo de código:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); 
res = client.storeFile("File Name", bis); 
bis.close(); 
client.logout(); 
+0

todavía se corrompe. :/ – CodeGuy

+0

Dos preguntas breves: ¿ha intentado abrir el archivo en la máquina del cliente? ¿Has intentado enviar un archivo diferente? – MByD

+0

sí, otros archivos están bien. y ¿qué quieres decir con abrirlo en la máquina del cliente? Básicamente, después de subirlo, lo descargo a mi máquina local. es un ftp en un sitio web que tengo. – CodeGuy

2

De documentation

Este método no cierra la dada InputStream.

tan cerca del FileInputStream antes de llamar logout()

+0

+1 Di una alternativa, pero usted señaló el problema. – MByD

+0

todavía se corrompe:/ – CodeGuy

+0

@ reising1 No estoy seguro, ¿has probado la sugerencia de @ MByd? –

9

A menudo se olvida que FTP tiene dos modos de funcionamiento - uno para archivos de texto y el otro para los archivos binarios (imagen). En los viejos tiempos, al conectarnos desde un cliente FTP de línea de comando, recordamos cuidadosamente configurar el modo de transferencia antes de solicitar un archivo, o nos topamos con el tipo de problema que parece tener. Hoy en día, muchas situaciones parecen predeterminadas como binarias, pero aparentemente no son tuyas.

Probablemente necesite decirle a su implementación ftp que transfiera en modo binario/imagen.

+0

Tu comentario acaba de resolver un problema de dos años que estaba teniendo. Saludos a ti. –

21

añadir esto a su archivo

ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE); 
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE); 

tuve el mismo problema con los archivos xlsx y esto fue una buena solución.

+4

No creo que quiera llamar a setFileTransferMode de esa manera: según JavaDoc, solo debe tomar las constantes FTP. * _ TRANSFER_MODE. –

+1

-1, esta respuesta es incorrecta y resulta en perder el tiempo. Solo ftp.setFileType (FTP.BINARY_FILE_TYPE); es obligatorio, si pones el 2do parámetro ftp.setFileType (FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE) el archivo está dañado (con pdf y xls) – amdev

+0

¿Ha cambiado algo en FTPClient? Porque para mí es FTPClient.BINARY_FILE_TYPE. – sigi

1

Pruebe esto.

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE); 

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE); 

objFtpClient.enterLocalPassiveMode(); 
1

para mí solamente ftp.setFileType (FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE) trabajaban, mientras que cuando yo estaba usando ftp.setFileTransferMode (FTP.BINARY_FILE_TYPE) del archivo estaba corrupto.