首先需要两个jar包:commons-net-3.3.jar和commons-logging-1.2.jar,可以去http://download.csdn.net/detail/dengfengdeling/9565359下载。
先建立ftp连接:
/**
* 建立FTP连接
*
* @param ftpHost
* 服务器地址
* @param ftpPassword
* 密码
* @param ftpUserName
* 用户名
* @param ftpPort
* 端口号
* @return
*/
public class FTPUtil {
public static FTPClient getFtpClient(String ftpHost, String ftpPassword, String ftpUserName, int ftpPort) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(ftpHost, ftpPort);
ftpClient.login(ftpUserName, ftpPassword);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
System.out.println("未连接到FTP,用户名或密码错误");
ftpClient.disconnect();
} else {
System.out.println("FTP连接成功");
}
} catch (SocketException e) {
e.printStackTrace();
System.out.println("FTP的IP地址可能错误,请正确配置");
} catch (IOException e) {
e.printStackTrace();
System.out.println("FTP的端口错误,请正确配置");
}
return ftpClient;
}
}
建立好ftp连接后,就可以上传文件了:
<pre name="code" class="java">public void upload(String ftpUserName, String ftpPassword, String ftpHost, int ftpPort) {
FTPClient ftpClient = null;
FileInputStream fis = null;
System.out.println("开始上传文件到FTP");
ftpClient = FTPUtil.getFtpClient(ftpHost, ftpPassword, ftpUserName, ftpPort);
try {
// 设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
// 设置以二进制流的方式传输
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//本地需要上传的文件的目录
File srcFile = new File("F:\\test.zip");
fis = new FileInputStream(srcFile);
// 设置上传目录-服务器端
ftpClient.changeWorkingDirectory("picture/flower");
//设置缓存大小
ftpClient.setBufferSize(1024);
//设置编码格式
ftpClient.setControlEncoding("UTF-8");
boolean storeFlag = ftpClient.storeFile("ftp_test.zip", fis);
System.out.println("storeFlag--->" + storeFlag);
} catch (IOException e1) {
e1.printStackTrace();
System.out.println("FTP客户端出错");
} finally {
try {
fis.close();
ftpClient.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最后在FTPMain类中调用该upload方法即可完成文件的上传:
public class FTPMain {
public static void main(String[] args) {
WriteFTPFile write = new WriteFTPFile();
write.upload("name", "password", "192.168.1.108", 30);
}
}
你以为这样就完了吗!?
生活处处有惊喜,代码处处有bug!我说说我遇到的”坑”吧(PS:我是边学边写,可能有一些大神们看来很小的问题,请大神们自动忽略我。。。)
1、ftpClient调用changeWorkingDirectory("picture/flower")返回false。查了大量的资料,结果发现服务器端根本没有flower目录。。。
首先调用ftpClient.changeWorkingDirectory(“/”)进入服务器根目录,然后列出根目录下的所有文件:
FTPFile[] files = ftpClient.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(i + "-name:" + files[i].getName());
}
发现有pictire目录,然后重新启动程序进入到ftpClient.changeWorkingDirectory(“/picture”)目录,再列出picture目录下的所有文件,发现根本没有flower目录。。。(PS:因为服务器端是另外的小伙伴写的,写程序之前忘了沟通目录是否存在了)。
所以只能自己创建flower目录:先进入到picture目录下,然后调用ftpClient.makeDirectory(“flower”)方法创建flower目录,返回true则表示创建成功
2、ftpClient连续两次调用changeWorkingDirectory(“”)方法进入非根目录,第二次会返回false,示例如下:
错误示例:
ftpClient.changeWorkingDirectory(“picture”)//返回true
ftpClient.changeWorkingDirectory(“picture/flower”)//返回false
正确示例:
ftpClient.changeWorkingDirectory(“picture”)//返回true
ftpClient.changeWorkingDirectory(“/”)//回到根目录
ftpClient.changeWorkingDirectory(“picture/flower”)//返回true
即:调用changeWorkingDirectory方法进入非根目录后,再次调用changeWorkingDirectory方法进入非根目录之前,必须先回到根目录,
否则第二次调用会失败。这也就是为什么在1中用红色字体特别标注“重新启动程序”的原因