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();
}
}