关于使用FTP上传文件到服务器的小总结-java

首先需要两个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中用红色字体特别标注“重新启动程序”的原因


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值