Source Code : Graphical Ftp client

Graphical Ftp client

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;

import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;

public class FTPApp extends JFrame {
  public static int BUFFER_SIZE = 10240;

  protected JTextField userNameTextField = new JTextField("anonymous");

  protected JPasswordField passwordTextField = new JPasswordField(10);

  protected JTextField urlTextField = new JTextField(20);

  protected JTextField fileTextField = new JTextField(10);

  protected JTextArea monitorTextArea = new JTextArea(5, 20);

  protected JProgressBar m_progress = new JProgressBar();

  protected JButton putButton = new JButton("Put");

  protected JButton getButton;

  protected JButton fileButton = new JButton("File");

  protected JButton closeButton = new JButton("Close");

  protected JFileChooser fileChooser = new JFileChooser();
 
  protected FtpClient ftpClient;

  protected String localFileName;

  protected String remoteFileName;

  public FTPApp() {
  super("FTP Client");

  JPanel p = new JPanel();
  p.setBorder(new EmptyBorder(5, 5, 5, 5));

  p.add(new JLabel("User name:"));
  p.add(userNameTextField);
  p.add(new JLabel("Password:"));
  p.add(passwordTextField);
  p.add(new JLabel("URL:"));
  p.add(urlTextField);
  p.add(new JLabel("File:"));
  p.add(fileTextField);

  monitorTextArea.setEditable(false);
  JScrollPane ps = new JScrollPane(monitorTextArea);
  p.add(ps);

  m_progress.setStringPainted(true);
  m_progress.setBorder(new BevelBorder(BevelBorder.LOWERED, Color.white,
  Color.gray));
  m_progress.setMinimum(0);
  JPanel p1 = new JPanel(new BorderLayout());
  p1.add(m_progress, BorderLayout.CENTER);
  p.add(p1);

  ActionListener lst = new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  if (connect()) {
  Thread uploader = new Thread() {
  public void run() {
  putFile();
  disconnect();
  }
  };
  uploader.start();
  }
  }
  };
  putButton.addActionListener(lst);
  putButton.setMnemonic('p');
  p.add(putButton);

  getButton = new JButton("Get");
  lst = new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  if (connect()) {
  Thread downloader = new Thread() {
  public void run() {
  getFile();
  disconnect();
  }
  };
  downloader.start();
  }
  }
  };
  getButton.addActionListener(lst);
  getButton.setMnemonic('g');
  p.add(getButton);

  lst = new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  if (fileChooser.showSaveDialog(FTPApp.this) != JFileChooser.APPROVE_OPTION)
  return;
  File f = fileChooser.getSelectedFile();
  fileTextField.setText(f.getPath());
  }
  };
  fileButton.addActionListener(lst);
  fileButton.setMnemonic('f');
  p.add(fileButton);
   
  lst = new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  if (ftpClient != null)
  disconnect();
  else
  System.exit(0);
  }
  };
  closeButton.addActionListener(lst);
  closeButton.setDefaultCapable(true);
  closeButton.setMnemonic('g');
  p.add(closeButton);

  getContentPane().add(p, BorderLayout.CENTER);
   
  fileChooser.setCurrentDirectory(new File("."));
  fileChooser
  .setApproveButtonToolTipText("Select file for upload/download");

  WindowListener wndCloser = new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
  disconnect();
  System.exit(0);
  }
  };
  addWindowListener(wndCloser);

  setSize(720, 240);
  setVisible(true);
  }

  public void setButtonStates(boolean state) {
  putButton.setEnabled(state);
  getButton.setEnabled(state);
  fileButton.setEnabled(state);
  }

  protected boolean connect() {
  monitorTextArea.setText("");
  setButtonStates(false);
  closeButton.setText("Cancel");
  setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

  String user = userNameTextField.getText();
  if (user.length() == 0) {
  setMessage("Please enter user name");
  setButtonStates(true);
  return false;
  }
  String password = new String(passwordTextField.getPassword());
  String sUrl = urlTextField.getText();
  if (sUrl.length() == 0) {
  setMessage("Please enter URL");
  setButtonStates(true);
  return false;
  }
  localFileName = fileTextField.getText();

  // Parse URL
  int index = sUrl.indexOf("//");
  if (index >= 0)
  sUrl = sUrl.substring(index + 2);

  index = sUrl.indexOf("/");
  String host = sUrl.substring(0, index);
  sUrl = sUrl.substring(index + 1);

  String sDir = "";
  index = sUrl.lastIndexOf("/");
  if (index >= 0) {
  sDir = sUrl.substring(0, index);
  sUrl = sUrl.substring(index + 1);
  }
  remoteFileName = sUrl;

  try {
  setMessage("Connecting to host " + host);
  ftpClient = new FtpClient(host);
  ftpClient.login(user, password);
  setMessage("User " + user + " login OK");
  setMessage(ftpClient.welcomeMsg);
  ftpClient.cd(sDir);
  setMessage("Directory: " + sDir);
  ftpClient.binary();
  return true;
  } catch (Exception ex) {
  setMessage("Error: " + ex.toString());
  setButtonStates(true);
  return false;
  }
  }

  protected void disconnect() {
  if (ftpClient != null) {
  try {
  ftpClient.closeServer();
  } catch (IOException ex) {
  }
  ftpClient = null;
  }
  Runnable runner = new Runnable() {
  public void run() {
  m_progress.setValue(0);
  putButton.setEnabled(true);
  getButton.setEnabled(true);
  fileButton.setEnabled(true);
  closeButton.setText("Close");
  FTPApp.this.setCursor(Cursor
  .getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  }
  };
  SwingUtilities.invokeLater(runner);
  }

  protected void getFile() {
  if (localFileName.length() == 0) {
  localFileName = remoteFileName;
  SwingUtilities.invokeLater(new Runnable() {
  public void run() {
  fileTextField.setText(localFileName);
  }
  });
  }
  byte[] buffer = new byte[BUFFER_SIZE];
  try {
  int size = getFileSize(ftpClient, remoteFileName);
  if (size > 0) {
  setMessage("File " + remoteFileName + ": " + size + " bytes");
  setProgressMaximum(size);
  } else
  setMessage("File " + remoteFileName + ": size unknown");
  FileOutputStream out = new FileOutputStream(localFileName);
  InputStream in = ftpClient.get(remoteFileName);
  int counter = 0;
  while (true) {
  int bytes = in.read(buffer);
  if (bytes < 0)
  break;

  out.write(buffer, 0, bytes);
  counter += bytes;
  if (size > 0) {
  setProgressValue(counter);
  int proc = (int) Math
  .round(m_progress.getPercentComplete() * 100);
  setProgressString(proc + " %");
  } else {
  int kb = counter / 1024;
  setProgressString(kb + " KB");
  }
  }
  out.close();
  in.close();
  } catch (Exception ex) {
  setMessage("Error: " + ex.toString());
  }
  }

  protected void putFile() {
  if (localFileName.length() == 0) {
  setMessage("Please enter file name");
  }
  byte[] buffer = new byte[BUFFER_SIZE];
  try {
  File f = new File(localFileName);
  int size = (int) f.length();
  setMessage("File " + localFileName + ": " + size + " bytes");
  setProgressMaximum(size);
  FileInputStream in = new FileInputStream(localFileName);
  OutputStream out = ftpClient.put(remoteFileName);

  int counter = 0;
  while (true) {
  int bytes = in.read(buffer);
  if (bytes < 0)
  break;
  out.write(buffer, 0, bytes);
  counter += bytes;
  setProgressValue(counter);
  int proc = (int) Math
  .round(m_progress.getPercentComplete() * 100);
  setProgressString(proc + " %");
  }

  out.close();
  in.close();
  } catch (Exception ex) {
  setMessage("Error: " + ex.toString());
  }
  }

  protected void setMessage(final String str) {
  if (str != null) {
  Runnable runner = new Runnable() {
  public void run() {
  monitorTextArea.append(str + '\n');
  monitorTextArea.repaint();
  }
  };
  SwingUtilities.invokeLater(runner);
  }
  }

  protected void setProgressValue(final int value) {
  Runnable runner = new Runnable() {
  public void run() {
  m_progress.setValue(value);
  }
  };
  SwingUtilities.invokeLater(runner);
  }

  protected void setProgressMaximum(final int value) {
  Runnable runner = new Runnable() {
  public void run() {
  m_progress.setMaximum(value);
  }
  };
  SwingUtilities.invokeLater(runner);
  }

  protected void setProgressString(final String string) {
  Runnable runner = new Runnable() {
  public void run() {
  m_progress.setString(string);
  }
  };
  SwingUtilities.invokeLater(runner);
  }

  public static int getFileSize(FtpClient client, String fileName)
  throws IOException {
  TelnetInputStream lst = client.list();
  String str = "";
  fileName = fileName.toLowerCase();
  while (true) {
  int c = lst.read();
  char ch = (char) c;
  if (c < 0 || ch == '\n') {
  str = str.toLowerCase();
  if (str.indexOf(fileName) >= 0) {
  StringTokenizer tk = new StringTokenizer(str);
  int index = 0;
  while (tk.hasMoreTokens()) {
  String token = tk.nextToken();
  if (index == 4)
  try {
  return Integer.parseInt(token);
  } catch (NumberFormatException ex) {
  return -1;
  }
  index++;
  }
  }
  str = "";
  }
  if (c <= 0)
  break;
  str += ch;
  }
  return -1;
  }

  public static void main(String argv[]) {
  new FTPApp();
  }
}