example java file upload sftp jsch

example - sftp java



carga de archivos con éxito, pero el archivo de 0kb se carga en el servidor remoto usando jsch sftp java (2)

Estoy cargando un archivo desde mi computadora local a un servidor remoto en una aplicación Java simple usando Jsch y el protocolo Sftp.

Mi código no muestra ningún error ni excepción y se ejecuta con éxito, pero cuando miro la ubicación remota, el archivo se carga como 0kb sin extensión y se nombra como ''D''.

Lo he intentado de muchas maneras, pero no puedo descifrar el error.

Aquí está mi código ...

String remoteDirectory = "D://Datastores//RootStore//Test//"; String localDirectory = "C://pdffiles//"; String fileToFTP = "demo.pdf"; String SFTPHOST = "hostIPaddress"; int SFTPPORT = 22; String SFTPUSER = "username"; String SFTPPASS = "password"; String local_filename = fileToFTP; String local_pathname = localDirectory; String remote_filename = fileToFTP; JSch jsch = null; Session session = null; ChannelSftp sftpChannel = null; try { jsch = new JSch(); session = jsch.getSession(SFTPUSER, SFTPHOST); session.setPassword(SFTPPASS); session.setPort(SFTPPORT); session.setConfig("StrictHostKeyChecking", "no"); session.setConfig("cipher.s2c", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr"); session.setConfig("cipher.c2s", "aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,aes256-ctr"); session.connect(); sftpChannel = (ChannelSftp)session.openChannel("sftp"); sftpChannel.connect(); System.out.println(sftpChannel); System.out.println(sftpChannel.getSession().isConnected()); FileInputStream fileBodyIns = new FileInputStream(local_pathname + local_filename); System.out.println(local_pathname + local_filename); System.out.println(remoteDirectory + remote_filename); sftpChannel.put(fileBodyIns, remoteDirectory + remote_filename); fileBodyIns.close(); sftpChannel.exit(); session.disconnect(); System.out.println("File uploaded successfully"); return "File uploaded successfully"; } catch (Exception e) { e.printStackTrace(); return e.getMessage(); }

Mi conexión es exitosa, la línea

System.out.println(sftpChannel.getSession().isConnected());

da verdadero

y la siguiente línea imprime con éxito

System.out.println("File uploaded successfully");


Estoy de acuerdo con la respuesta de Kenster. Tuve un problema similar en la máquina remota de Windows y la ruta con el estilo de Linux resolvió mi problema. Solo quería agregar, el directorio raíz de ChannelSftp es C: / disk en la máquina remota de Windows y no estoy seguro de que haya una manera de poner el archivo en D: / disk.


String remoteDirectory = "D://Datastores//RootStore//Test//";

El protocolo SFTP usa un esquema de nombres tipo Unix para nombres de rutas de archivos en el servidor remoto. El separador de archivos es "/", y un nombre de ruta sin un "/" inicial se considera relativo al directorio actual. Los dos puntos y las barras diagonales no tienen un significado especial.

Según esas reglas, le está pidiendo al servidor remoto que cree un archivo en su directorio de inicio llamado "D: / DataStores ..." con un literal de dos puntos y barras diagonales inversas. Si su servidor remoto es el servidor Cygwin OpenSSH o algún otro puerto de un servidor basado en Unix, puede haber una discrepancia entre la forma en que el servidor SFTP interpreta el nombre de archivo y la forma en que el sistema operativo Windows interpreta el nombre del archivo.

Debe averiguar la sintaxis correcta para referirse a las rutas en la unidad D: a través de este servidor SFTP. Si se trata del servidor Cygwin SFTP, creo que la sintaxis correcta sería "/ cygdrive / d / Datastores / RootStore / Test / ...". Si el servidor SFTP es de otro proveedor, es posible que deba consultar la documentación del servidor. Alternativamente, puede intentar iniciar sesión en el servidor SFTP de forma interactiva, acceder al directorio "/" y explorar desde allí. Debería ser obvio cómo hacer referencia a las carpetas en la unidad D.