想为新作的Blog客户端易博增加FTP上传的功能,最省地的方法当然是利用JDK里的Socket类自己处理FTP的协议,虽然FTP不算是很复杂的协议,但是实现起来还是有点麻烦,容易出错。当然不如使用现成的工具库来得省事可靠。
Java World上有篇比较支持FTP协议的Java工具库的文章,写得很全面。
Java FTP client libraries reviewed
粗略看了一边,决定选择The Jakarta Project, Jakarta Commons/Net。Common Net是Jakarta Commons下的一个子项目,支持包括FTP在内的多种Internet协议, 其他有比如Finger, Whois,Telnet,POP3等等。
Common Net支持FTP的关键类是org.apache.commons.net.ftp.FTPClient. 下面介绍一些具体的使用方法。
1. 使用FTPClient连接和登录FTP服务器
- FTPClient ftp = new FTPClient();
- ftp.connect(server);
- ftp.login(username, password);
- System.out.println("Connected to " + server + ".");
- System.out.print(ftp.getReplyString());
类似使用ftp命令登录FTP服务器以后,可以执行各种命令比如cd和ls,可以调用FTPClient的函数比如FTPClient.changeWorkingDirectory(folder); 改变当前目录, FTPClient.listFiles()枚举当前目录下的所有文件。
2. 使用FTPClient下载文件
- FTPFile[] files = ftp.listFiles();
- System.out.println("Number of files in dir: " + files.length);
- for (int i = 0; i < files.length; i++) {
- File file = new File(destinationFolder + File.separator
- + files[i].getName());
- FileOutputStream fos = new FileOutputStream(file);
- ftp.retrieveFile(files[i].getName(), fos);
- fos.close();
- file.setLastModified(fileDate.getTime());
- }
FTPClient.retrieveFile从FTP服务器上取回一个文件。其实我更关心的是上传的功能。
3. 使用FTPClient上传文件
- FileInputStream fis = new FileInputStream(localFileName);
- ftp.storeFile(remoteFileName, fis);
和retrieveFile相对应的storeFile上传一个本地文件。完事后别忘了关闭FTPClient。
4. 关闭FTPClient
- ftp.logout();
- ftp.disconnect();
简洁起见,以上的代码忽略了错误处理。FTPClient还支持其他一些函数,比如makeDirectory(String pathname) 在服务器上新建一个目录。rename(String from, String to) 改变一个文件的名字。 具体的请参照Commons Net的API文档。