edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活。edtftpj有多种版本,分别是java、.net和js版本。对于Java版的有一个免费版本。我用的就是免费版本。其余的均为商业版本。
为了开发,先下载免费版本的开发包。
主 页:http://www.enterprisedt.com/
工具包:http://www.enterprisedt.com/products/edtftpj/download/edtftpj.zip
目前我用的是2.03。
在开发FTP客户端工具之前,先看看其E文的开发指南:
一、开发指南
1、在开发中,最核心的API在两个类中,分别是:
FileTransferClient 通过构建此对象来是进行FTP文件传输. 支持 "plain" FTP, i.e. RFC 959 FTP
FTPClient 功能和FileTransferClient一样,已经被废弃. 支持 "plain" FTP, i.e. RFC 959 FTP
2、连接一个FTP服务器
1)、构建FileTransferClient对象
FileTransferClient ftp = new FileTransferClient();
2)、设置远程主机和用户认证
ftp.setRemoteHost(host);
ftp.setUserName(username);
ftp.setPassword(password);
ftp.setRemotePort(21);
ftp.setTimeout(1200);
3)、登录到服务器
ftp.connect();
4)、关闭连接
ftp.disconnect();
3、设置更多的连接属性
1)、设置自动登录
ftp.getAdvancedFTPSettings().setAutoLogin(false);
2)、设置传输缓冲区
ftp.getAdvancedSettings().setTransferBufferSize(1024)
3)、设置获取服务器端信息时所使用的编码
ftp.getAdvancedSettings().setControlEncoding("GBK");
4)、设置传输通知的时间间隔
ftp.getAdvancedSettings().setTransferNotifyInterval(5000);
5)、其他的一些设置
ftp.getAdvancedFTPSettings().setConnectMode(FTPConnectMode.ACTIVE);
ftp.getAdvancedFTPSettings().setActivePortRange(61500, 61510);
ftp.getAdvancedFTPSettings().setConnectMode(FTPConnectMode.PASV);
4、改变当前的工作目录
1)、获取当前的ftp工作目录
string directory = ftp.getRemoteDirectory();
2)、改变当前的工作目录
ftp.changeDirectory(directory);
3)、改变当前的工作目录为其父目录
ftp.changeToParentDirectory();
5、上传与下载、暂停
1)、上传
ftp.uploadFile(java.lang.String localFileName, java.lang.String remoteFileName)
2)、下载
ftp.downloadFile(java.lang.String localFileName, java.lang.String remoteFileName)
3)、暂停所有的传输
ftp.cancelAllTransfers()
当然,以上很多方法都有多中重载格式。下面给出一个简单封装的JavaFTP客户端工具:
二、封装的客户端工具
import com.enterprisedt.net.ftp.FTPException; import com.enterprisedt.net.ftp.FTPFile; import com.enterprisedt.net.ftp.FileTransferClient; import com.enterprisedt.net.ftp.WriteMode; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.File; import java.io.IOException; import java.text.ParseException; /** * edtftpj-2.0.3 工具简单封装测试 * * @author leizhimin 2008-9-19 13:33:03 */ public class FtpUtil { private static Log log = LogFactory.getLog(FtpUtil.class); private FileTransferClient client = null; public static void main(String[] args) throws FTPException, IOException { FtpUtil ftp = new FtpUtil(); // ftp.connectServer(); File file = new File("C:\ooo\upx"); UploadListener listener = new UploadListener(ftp.client); ftp.ftpUploadFolder(file, listener); ftp.ftpDownload("c:\new1111.gif", "/upx/down.gif"); ftp.disconnect(); } public FtpUtil() { this.connectServer(); } public FileTransferClient getClient() { return client; } /** * 连接ftp服务器 * * @return 连接成功标识 */ public boolean connectServer() { boolean flag = false; client = new FileTransferClient(); try { client.setUserName("admin"); client.setPassword("123"); client.setRemoteHost("localhost"); client.setRemotePort(21); client.setTimeout(1200); client.setEventListener(new UploadListener(client)); client.getAdvancedSettings().setTransferBufferSize(1000); client.getAdvancedSettings().setTransferNotifyInterval(5000); client.getAdvancedSettings().setControlEncoding("GBK"); client.connect(); flag = true; } catch (FTPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return flag; } /** * 关闭FTP客户端连接 * * @return 关闭成功标识 */ public boolean disconnect() { boolean flag = false; try { client.disconnect(); flag = true; } catch (FTPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return flag; } /** * 上传文件 * * @param file 文件 * @param ul 监听器 */ public void ftpUploadFile(File file, UploadListener ul) { String fileName = file.getName(); String filePath = file.getPath(); try { client.uploadFile(filePath, fileName, WriteMode.RESUME); int len = (int) client.getSize(fileName); log.info("上传文件" + filePath + "完成,大小为" + len + "字节!"); } catch (FTPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 上传文件(夹) * * @param file 上传文件 * @param ul 上传监听器 */ public void ftpUploadFolder(File file, UploadListener ul) { if (file.isFile()) { ftpUploadFile(file, ul); } try { if (file.isDirectory()) { FTPFile[] ftpFiles = client.directoryList(); boolean isExist = false; //遍历FTP当前目录的文件文件名,如果存在则停止查找,如果不存在则设计标记为不存在 for (FTPFile ftpFile : ftpFiles) { if (ftpFile.getName().equals(file.getName())) { isExist = true; break; } } //如果要上传的目录不存在,则创建上传目录 if (!isExist) { client.createDirectory(file.getName()); } //设置当前目录 client.changeDirectory(file.getName()); //上传文件的列表 File[] upFiles = file.listFiles(); for (File upFile : upFiles) { if (upFile.isFile()) { ftpUploadFile(upFile, ul); } else if (upFile.isDirectory()) { ftpUploadFolder(upFile, ul); } } client.changeToParentDirectory(); } } catch (FTPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } /** * 下载文件 * * @param localFileName 本地文件名 * @param remoteFileName 远程文件名 * @throws FTPException * @throws IOException */ public void ftpDownload(String localFileName, String remoteFileName) throws FTPException, IOException { client.downloadFile(localFileName, remoteFileName, WriteMode.OVERWRITE); } }
import com.enterprisedt.net.ftp.EventAdapter; import com.enterprisedt.net.ftp.FileTransferClient; /** * 上传过程监听类 * * @author leizhimin 2008-9-22 16:05:53 */ class UploadListener extends EventAdapter { private long bytesTransferred = 0; private FileTransferClient ftpClient; public UploadListener(FileTransferClient ftpClient) { this.ftpClient = ftpClient; } public void bytesTransferred(String connId, String remoteFilename, long bytes) { bytesTransferred = bytes; } }
运行结果:
2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile 信息: 上传文件C:oooupx11212.txt完成,大小为0字节! 2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile 信息: 上传文件C:oooupx11111.txt完成,大小为0字节! 2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile 信息: 上传文件C:oooupx11.txt完成,大小为0字节! 2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile 信息: 上传文件C:oooupx1新建 FDF Document.fdf完成,大小为0字节! 2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile 信息: 上传文件C:oooupx1新建 WinRAR 压缩文件.rar完成,大小为20字节! 2008-9-22 17:45:48 zzvcom.cms.ccm.jmkws.common.FtpUtil ftpUploadFile 信息: 上传文件C:oooupxaa.fdf完成,大小为0字节! Process finished with exit code 0
以上代码上传支持文件夹操作。
本文转自:http://lavasoft.blog.51cto.com/62575/101108/