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

本文介绍如何使用Java实现FTP文件上传功能,包括所需jar包、连接FTP服务器、上传文件及解决过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先需要两个jar包:commons-net-3.3.jar和commons-logging-1.2.jar,可以去http://download.youkuaiyun.com/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中用红色字体特别标注“重新启动程序”的原因


FTP服务器默认目录 FTP命令是Internet用户使用最频繁的命令之一,不论是在DOS还是UNIX操作系统下使用FTP,都会遇到大量的FTP内部命令。熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效。 FTP的命令行格式为:ftp -v -d -i -n -g [主机名],其中 -v显示远程服务器的所有响应信息; -n限制ftp的自动登录,即不使用; .n etrc文件-d使用调试方式; -g取消全局文件名。 ftp使用的内部命令如下(中括号表示可选项): 1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip. 2.$ macro-ame[args]:执行宏定义macro-name. 3.account[password]:提供登录远程系统成功后访问系统资源所需的补充口令。 4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。 5.ascii:使用ascii类型传输方式。 6.bell:每个命令执行完毕后计算机响铃一次。 7.bin:使用二进制文件传输方式。 8.bye:退出ftp会话过程。 9.case:在使用mget时,将远程主机文件名中的大转为小字母。 10.cd remote-dir:进入远程主机目录。 11.cdup:进入远程主机目录的父目录。 12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。 13.close:中断与远程服务器ftp会话(与open对应)。 14.cr:使用asscii方式传输文件时,将回车换行转换为回行。 15.delete remote-file:删除远程主机文件。 16.debug[debug-value]:设置调试方式,显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。 17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件local-file。 18.disconnection:同close。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值