style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Java Zone FTPClient

Esta vez desarrollamos un cliente FTP, esta es su segunda entrega, la primera solo tenia funcionalidad pero no interfaz grafica. Seguiremos agregandole opciones.

Codigo

Clase Principal

package clases;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.swing.*;

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

public class Principal extends JFrame{
 
 JTextArea consola;
 JSplitPane split;
 JPanel panelGUI,panelBotones;
 JScrollPane panelConsola;
 ArbolDirectorios arbolLocal,arbolRemoto;
 JButton btnTransARemoto;
 FTPClient ftp;
 
 public Principal(){
 
  colocarSkin();
 
  new FormularioAcceso(this);
 
  setLayout(new BorderLayout());
  consola=new JTextArea();
 
  split=new JSplitPane();
  split.setResizeWeight(0.5);
  arbolLocal=new ArbolDirectorios(this,1);
  arbolRemoto=new ArbolDirectorios(this,2);
  split.setLeftComponent(new JScrollPane(arbolLocal));
  split.setRightComponent(new JScrollPane(arbolRemoto));
 
  panelConsola=new JScrollPane(consola);
  panelConsola.setPreferredSize(new Dimension(300,140));
 
  panelBotones=new JPanel();
 
  btnTransARemoto=new JButton("Transferir");
  btnTransARemoto.addActionListener(new ActionListener(){

   @Override
   public void actionPerformed(ActionEvent arg0) {
    try {
     FileInputStream fis=new FileInputStream(arbolLocal.ruta);
     if(ftp.storeFile(arbolLocal.nombreArchivo,fis)){
      consola.append("Archivo Transferido \n");
            arbolRemoto.Raiz.removeAllChildren();
            arbolRemoto.modelo.reload();
            arbolRemoto.listaDirectorios(arbolRemoto.Raiz);
        }else
         consola.append("Error al Transferir el Archivo \n");
           
        fis.close();
    } catch (FileNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   
  });
 
  panelBotones.add(btnTransARemoto);
 
  panelGUI=new JPanel();
  panelGUI.setLayout(new BorderLayout());
  panelGUI.add(split,BorderLayout.CENTER);
  panelGUI.add(panelBotones,BorderLayout.SOUTH);
 
  add(panelGUI,BorderLayout.CENTER);
  add(panelConsola,BorderLayout.SOUTH);
 
  desactivarTodo();
 
 }
 
 public void desactivarTodo(){
  arbolLocal.explorador.setEnabled(false);
  arbolRemoto.explorador.setEnabled(false);
  consola.setEnabled(false);
 }
 
 public void activarTodo(){
  arbolLocal.explorador.setEnabled(true);
  arbolRemoto.explorador.setEnabled(true);
  consola.setEnabled(true);
 }
 
 private void colocarSkin() {
  try {
   UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
   } catch (ClassNotFoundException e) {
    e.printStackTrace();
   } catch (InstantiationException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   } catch (UnsupportedLookAndFeelException e) {
    e.printStackTrace();
   }
 }

 public static void main(String [] args){
  Principal p=new Principal();
  p.setVisible(true);
  p.setBounds(0, 0, 700, 400);
  p.setLocationRelativeTo(null);
  p.setDefaultCloseOperation(EXIT_ON_CLOSE);
 }

}

Clase FormularioAcceso

package clases;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.*;

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

public class FormularioAcceso extends JDialog{
 
 JPanel plogin;
 JTextField txtip,txtusuario;
 JPasswordField txtclave;
 JPanel panelBoton;
 JButton btnaceptar;
 Principal p;
 
 public FormularioAcceso(Principal prin){
 
  p=prin;
 
  plogin=new JPanel();
  plogin.setLayout(new GridLayout(3,2));
 
  txtip=new JTextField(10);
  txtusuario=new JTextField(10);
  txtclave=new JPasswordField(10);
 
  plogin.add(new JLabel("IP Servidor:"));
  plogin.add(txtip);
  plogin.add(new JLabel("Usuario:"));
  plogin.add(txtusuario);
  plogin.add(new JLabel("Contraseña:"));
  plogin.add(txtclave);
 
  JPanel paux=new JPanel();
  paux.add(plogin);
 
  panelBoton=new JPanel();
  btnaceptar=new JButton("Conectar");
  btnaceptar.addActionListener(new ActionListener(){

   @Override
   public void actionPerformed(ActionEvent arg0) {
     try {
     p.ftp = new FTPClient();
        p.ftp.connect(txtip.getText());
     if(p.ftp.login(txtusuario.getText(), new String(txtclave.getPassword()))){
         FormularioAcceso.this.dispose();
         p.activarTodo();
         p.arbolRemoto.swroot=true;
         p.arbolRemoto.listaDirectorios();
         p.arbolRemoto.updateUI();
         p.repaint();
         p.consola.append("Conectado al servidor "+txtip.getText()+" \n");
     }else{
         JOptionPane.showMessageDialog(null, "IP, usuario o Contraseña invalia.");
      p.desactivarTodo();
     }
    } catch (IOException e) {
     p.desactivarTodo();
     JOptionPane.showMessageDialog(null, "IP, usuario o Contraseña invalia.");
    }
   }
   
  });
  panelBoton.add(btnaceptar);
 
  add(paux);
  add(panelBoton,BorderLayout.SOUTH);
 
  this.setBounds(0, 0, 300, 140);
  this.setLocationRelativeTo(null);
  this.setAlwaysOnTop(true);
  this.setUndecorated(true);
  setVisible(true);
 
 }
}

Clase ArbolDirectorios

package clases;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.io.File;
import java.io.IOException;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;

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

public class ArbolDirectorios extends JPanel{
 
 JTree explorador;
 DefaultTreeModel modelo;
 DefaultMutableTreeNode Raiz,ultimoseleccionado;
 Principal p;
 int tipo=-1;
 boolean swroot=false;
 String ruta="";
 String nombreArchivo="";
 
 public ArbolDirectorios(Principal prin, int op){
 
  setLayout(new BorderLayout());
 
  p=prin;
  tipo=op;
 
  if(tipo==1){
   
      Raiz=new DefaultMutableTreeNode("Raiz");
      explorador=new JTree(Raiz);
      DefaultTreeCellRenderer render=(DefaultTreeCellRenderer)explorador.getCellRenderer();
      render.setLeafIcon(new ImageIcon(this.getClass().getResource("/lib/archivo.png")));
      render.setOpenIcon(new ImageIcon(this.getClass().getResource("/lib/carpeta.png")));
      render.setClosedIcon(new ImageIcon(this.getClass().getResource("/lib/carpeta.png")));
      explorador.addTreeSelectionListener(new TreeSelectionListener(){
 
   @Override
   public void valueChanged(TreeSelectionEvent arg0) {
    try{
     DefaultMutableTreeNode sel=(DefaultMutableTreeNode)explorador.getLastSelectedPathComponent();
     File fhijo=obtenerRuta(sel);
     ruta=fhijo.toString();
     nombreArchivo=sel.getUserObject().toString();
     if(swroot==false){
         
         for(int i=0;i<sel.getChildCount();i++){
          DefaultMutableTreeNode nieto=(DefaultMutableTreeNode)sel.getChildAt(i);
          agregarHijos(nieto);
         }
         swroot=true;
     }else{
      for(int i=0;i<sel.getChildCount();i++){
           DefaultMutableTreeNode nieto=(DefaultMutableTreeNode)sel.getChildAt(i);
           agregarHijos(nieto);
       }
     }
        }catch(NullPointerException npe){
         npe.printStackTrace();
        }
   }
     
     });
     
     for(int i=0;i<File.listRoots().length;i++){
       DefaultMutableTreeNode hijo=new DefaultMutableTreeNode(File.listRoots()[i]);
       Raiz.add(hijo);
     }  
     
  }else {
   Raiz=new DefaultMutableTreeNode("Raiz");
   modelo=new DefaultTreeModel(Raiz);
      explorador=new JTree(modelo);
      DefaultTreeCellRenderer render=(DefaultTreeCellRenderer)explorador.getCellRenderer();
      render.setLeafIcon(new ImageIcon(this.getClass().getResource("/lib/archivo.png")));
      render.setOpenIcon(new ImageIcon(this.getClass().getResource("/lib/carpeta.png")));
      render.setClosedIcon(new ImageIcon(this.getClass().getResource("/lib/carpeta.png")));
      explorador.addTreeSelectionListener(new TreeSelectionListener(){
 
   @Override
   public void valueChanged(TreeSelectionEvent arg0) {
    try{
     DefaultMutableTreeNode seleccionado=(DefaultMutableTreeNode)explorador.getLastSelectedPathComponent();
     DefaultMutableTreeNode se=null;
     if(seleccionado!=null){
      ruta=p.ftp.printWorkingDirectory()+"\\"+seleccionado.getUserObject();
     if(!seleccionado.isLeaf()){
      se=new DefaultMutableTreeNode(seleccionado.getUserObject());
      ultimoseleccionado=se;
      if(!se.toString().equalsIgnoreCase("Raiz")){
       Raiz.setUserObject(se.getUserObject());
       Raiz.removeAllChildren();
       modelo.reload();
       listaDirectorios(Raiz);
      }
     }
     }
        }catch(NullPointerException npe){
         npe.printStackTrace();
        } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
   }
     
     });
  }
   
    add(explorador);
 }
 
  public void listaDirectorios(DefaultMutableTreeNode padre){
   
      FTPFile[] ftpFiles;
   try {
    p.ftp.changeWorkingDirectory(padre.toString());
    ftpFiles = p.ftp.listDirectories();
    for (FTPFile ftpFile : ftpFiles) {
     if (ftpFile.getType() == FTPFile.DIRECTORY_TYPE) {
          DefaultMutableTreeNode d=new DefaultMutableTreeNode(ftpFile.getName());
          DefaultMutableTreeNode d2=new DefaultMutableTreeNode("De clic en la carpeta");
          d.add(d2);
          padre.add(d);
     }
        }
    ftpFiles = p.ftp.listFiles();
    for (FTPFile ftpFile : ftpFiles) {
     if (ftpFile.getType() == FTPFile.FILE_TYPE) {
          DefaultMutableTreeNode d=new DefaultMutableTreeNode(ftpFile.getName());
          padre.add(d);
     }
        }
   } catch (IOException e) {
    e.printStackTrace();
   }
   explorador.expandRow(0);
   ArbolDirectorios.this.updateUI();
   p.repaint();
  }
 
  public void listaDirectorios(){
   
      FTPFile[] ftpFiles;
   try {
    ftpFiles = p.ftp.listDirectories();
    for (FTPFile ftpFile : ftpFiles) {
          if (ftpFile.getType() == FTPFile.DIRECTORY_TYPE) {
           DefaultMutableTreeNode d=new DefaultMutableTreeNode(ftpFile.getName());
           DefaultMutableTreeNode d2=new DefaultMutableTreeNode("De clic en la carpeta");
           d.add(d2);
           Raiz.add(d);
          }
        }
    ftpFiles = p.ftp.listFiles();
    for (FTPFile ftpFile : ftpFiles) {
     if (ftpFile.getType() == FTPFile.FILE_TYPE) {
          DefaultMutableTreeNode d=new DefaultMutableTreeNode(ftpFile.getName());
          Raiz.add(d);
     }
        }
   } catch (IOException e) {
    e.printStackTrace();
   }
   explorador.expandRow(0);
   ArbolDirectorios.this.updateUI();
   p.repaint();
  }
 
  public void agregarHijos(DefaultMutableTreeNode padre){
    if(padre!=Raiz){
     try{
       File fpadre=obtenerRuta(padre);
       if(fpadre.isDirectory()){
        if(fpadre.listFiles().length>0){
         for(int i=0;i<fpadre.list().length;i++){
          DefaultMutableTreeNode hijo=new DefaultMutableTreeNode(fpadre.list()[i]);
          padre.add(hijo);
         }  
        }
       }
     }catch(NullPointerException npe){
       
       }
    }
 }
 
 public File obtenerRuta(DefaultMutableTreeNode p){
    String ruta="";
    for(int i=0;i<p.getPath().length-1;i++){
     ruta=ruta+p.getPath()[i+1]+"\\";
    }
    File f=new File(ruta);
    return f;
 }
}

Descarga

Pueden descargar el archivo desde aquí, o pueden visitarnos en Java Zone para mas información sobre este proyecto.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Muy buenas aplicaciones

Son muy útiles tus aplicaciones. Gracias por compartir.

Java Zone como siempre con

Java Zone como siempre con aplicaciones muy interesantes.

Estaría bien que usaras github para compartir tu código y/o que le pusieras alguna licencia open source.

Gracias

OscarRyz gracias por tus palabras, la verdad poco he usado este tipo de paginas para publicar el codigo, estoy en eso, viendo como funciona XD.

Imagen de lalo200

Agradecimiento

Que tal y muchas gracias por el aporte me parece fantástico, estoy aprendiendo un poco de la creación de un FTPCLient con la librería de commons net, sobre el IDE de NETBEANS en Java, revisaré el código por que exactamente quiero crear algo similar, y de nuevo gracias por el aporte. Saludos.

Imagen de lalo200

Sugerencia

Podrías montar denuevo el link descarga, por favor??? por que no se puede descargar debido a que desaparecieron a MegaUpload, de antemano gracias.

Imagen de neko069

Fuentes completos

A simple vista, los fuentes que acompañan el post crean la aplicación completa, porqué no los copias y verificas?

Excelente aplicacion

Seria de mejor opcion arrastrar los archivos y copiarlos del lado del servidor.

Imagen de lalo200

Preguntas y dudas :S

Hola que tal un saludo cordial a todos en el foro, primero una gran duda, como ya habia comentado soy principiante en esto de java y más aún en la librería de commons net y su capacidad para crear una peque ña interfaz FTP con el servidor, como la ya descrita en el tema, bueno la duda es la siguiente estoy apenas empezando con un pequeño código para subir un archivo de manera local a mi FTP, todo va bien me puedo "logear", el detalle viene cuando se va a subir el archivo me aparece el siguiente error:

java.net.SocketException: Permission denied: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)

Me falta agregar algun JAVADOC??, es detalle de mi version del JDK, por que estoy trabajando con la versión nueva la 1.7, con el IDE en NETBEANS, bueno de antemano gracias y si alguien en el foro conoce el porque de mi error me sería de gran ayuda para la creación de mi aplicación. GRACIAS :D

Imagen de lalo200

Algún ejemplo?

O bueno otra opción tal vez sería si tienen algunos ejemplos para subir un archivo al servidor FTP, descargar, borrar y dictar el directorio donde se alojan los archivos en el FTP, de nuevo muchísimas gracias, hasta luego. :)

Imagen de lalo200

Probando código

Buen día compañeros del foro, pues esta vez, como parte del comentario de Neko069, hice copia del código para probarlo, pero me surgen unas dudas, la primera es en esta parte del código, el cual se encuentra en la clase ArbolDirectorios:

if(tipo==1){

Raiz=new DefaultMutableTreeNode("Raiz");
explorador=new JTree(Raiz);
DefaultTreeCellRenderer render=(DefaultTreeCellRenderer)explorador.getCellRenderer();
render.setLeafIcon(new ImageIcon(this.getClass().getResource("/")));
render.setOpenIcon(new ImageIcon(this.getClass().getResource("/")));
render.setClosedIcon(new ImageIcon(this.getClass().getResource("/")));
explorador.addTreeSelectionListener(new TreeSelectionListener(){

Mi pregunta es que "rutas" van en los tres getSource("/Ruta de los archivos del FTP"), sería la ruta donde está mi localhost??? en este caso sería la ruta de mis documentos o que rollo, :S??????. De nuevo gracias. Hasta luego.

Imagen de lalo200

Problema solucionado compañeros

Que tal compañeros del foro de nuevo aquí con unas dudillas, bueno al parecer era bronca de arreglar el classphat, para que tomará la imagen de archivo y carpeta.png, incluida en la ruta del "render.setClosedIcon(new ImageIcon(this.getClass().getResource", añadí el archivo como un.zip donde trajera dichas rutas y al parecer eso era el problema de que no arrancaba la parte de despliegue del arbol, em confirmando estoy utilizando el IDE de Netbeans y no Eclipse, pero bueno la aplicación corre y genera del lado izquierdo mi directorio desde raíz, pero en la parte derecha no aparece nada :S, em que podrá ser ocuparía agregar otros archivos o classphat?????, y la aplicación funciona y todo pero me aparecen también estos errores:

ava.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.io.BufferedWriter.flush(BufferedWriter.java:254)
at org.apache.commons.net.ftp.FTP.__send(FTP.java:501)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:475)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:552)

Que podrá ser??????? será que por eso no me está mostrando la parte derecha del arbol de despliegue para transferir el archivo o que podrá ser???????, bueno de antemano gracias y disculpen las molestias , hasta luego. :D :)

Imagen de lalo200

Porque no despliega el segundo arbol????

Que tal compañeros, probando la aplicación otorgada, gracias al compañero roger1345's, gracias por el aporte.

La duda es por que no me lista el directorio del lado derecho, sólo aparece desde "raíz", del lado izquierdo, es decir, lista el directorio de C:, D:, E: etc, el detalle es que no lista el directorio del lado derecho que es donde se supone estan mis archivos locales no??????, la verdad como ya lo habia comentado soy principiante en esto de JAVA y más aún en el uso de la librería de commons net, ya eh manejado código para subir un archivo y login, cosas básicas para poder entender un poco de la esta librería "commons net", bueno espero y me puedan aclarar esa duda, y gracias compañeros del foro.

Imagen de lalo200

Aplicación funcionando perfectamente :D

Que tal compañeros del foro después de tanto estar buscando en la red respuesta a mis dudas, por fin di con el problema, pensando que eran broncas del código fuente otorgado en el foro, pues me di cuenta que el error de:

java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.io.BufferedWriter.flush(BufferedWriter.java:254)
at org.apache.commons.net.ftp.FTP.__send(FTP.java:501)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:475)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:552)

Era por el firewall de windows, como recomendación compañeros del foro, desactiven el cortafuegos de windows, en mi caso estaba utilizando lo siguiente, para que si les llegase a suceder mi caso, la solución es la siguiente:

1.- Desactivar el cortafuegos de windows.
2.- Agregar todo al classphat, necesario para correr la aplicación. (el .jar de la librería de commons net 3.1)
3.- En mi caso utilizo el IDE de NETBEANS 7.2
4.- Mi JDK es el actual 1.7
5.- Mi S.O es windows 7.

Y también una pequeñita colaboración de alguien principiante en java. Pues verificando la aplicación y transfiriendo distinto tipos de archivos me di cuenta de que para archivos .txt los transfería de lujo, pero los archivos diferentes no los transferia correctamente, así es que la modificación es la siguiente:
1.- En la clase "PRINCIPAL", añadir la siguiente línea de código.
2.- ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
En el método :
public void actionPerformed(ActionEvent arg0)

Después de la línea:
FileInputStream fis = new FileInputStream(arbolLocal.ruta);

ahí añadirán el pequeño código que agregué para que puedan transferir cualquier tipo de archivo, bueno compañeros me despido y pues dandole las gracias a roger1345's por su excelente colaboración con el código proporcionado, muchísmias gracias compañero. :D :)

Imagen de lalo200

De que manera colocar otro botón en la aplicación.

Que tal compañeros del foro una duda, de que forma se le prodría agregar otro botón a la aplicación???, se modifica demasiado el código????, pues de antemano gracias y espero que me puedan alcarar esa duda, con un leve ejemplillo sería más que suficiente. gracias.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">