【java利用FTP工具上传、下载、删除其他服务器文件】

问题:java应用部署在A服务器,想通过A服务器将文件上传至B服务器
解答
1、在B服务器上搭建FTP服务,网上很多,可以参考这个
windows server2008 R2搭建ftp服务器

2,在A服务器的应用里编写代码
A,需要引用的jar包

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

B,上传方法

/**
	 * 上传文件至FTP服务器
	 * 
	 * @param url
	 * 		服务器IP地址
	 * @param port
	 * 		服务器端口
	 * @param userName
	 * 		用户登录名
	 * @param password
	 * 		用户登录密码
	 * @param storePath
	 * 		服务器文件存储路径
	 * @param fileName
	 * 		服务器文件存储名称
	 * @param is
	 * 		文件输入流
	 * @return
	 * 		<b>true</b>:上传成功
	 * 		<br/>
	 * 		<b>false</b>:上传失败
	 */
public static boolean storeFile (String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			// 连接至服务器,端口默认为21时,可直接通过URL连接
			ftp.connect(url ,port);
			// 登录服务器
			ftp.login(userName, password);
			// 判断返回码是否合法
			if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
				// 不合法时断开连接
				ftp.disconnect();
				// 结束程序
				return result;
			}
			// 判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录
			String s = "/"+storePath;
			String[] dirs = s.split("/");
			ftp.changeWorkingDirectory("/");			
	            //按顺序检查目录是否存在,不存在则创建目录  
	            for(int i=1; dirs!=null&&i<dirs.length; i++) {  
	                if(!ftp.changeWorkingDirectory(dirs[i])) {  
	                    if(ftp.makeDirectory(dirs[i])) {  
	                        if(!ftp.changeWorkingDirectory(dirs[i])) {  
	                            return false;  
	                        }  
	                    }else {  
	                        return false;                         
	                    }  
	                }  
	            }  
			// 设置文件操作目录
			ftp.changeWorkingDirectory(storePath);
			// 设置文件类型,二进制
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 设置缓冲区大小
			ftp.setBufferSize(3072);
			//主动式改为被动式
			ftp.enterLocalPassiveMode();
			// 上传文件
			result = ftp.storeFile(fileName, is);
			// 关闭输入流
			is.close();
			// 登出服务器
			ftp.logout();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 判断输入流是否存在
				if (null != is) {
					// 关闭输入流
					is.close();
				}
				// 判断连接是否存在
				if (ftp.isConnected()) {
					// 断开连接
					ftp.disconnect();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return result;
	}
	

C,下载方法

/**
	 * 从FTP服务器下载文件至本地
	 * 
	 * @param url
	 * 		服务器IP地址
	 * @param port
	 * 		服务器端口
	 * @param userName
	 * 		用户登录名
	 * @param password
	 * 		用户登录密码
	 * @param remotePath
	 * 		服务器文件存储路径
	 * @param fileName
	 * 		服务器文件存储名称
	 * @param localPath
	 * 		本地文件存储路径
	 * @return
	 * 		<b>true</b>:下载成功
	 * 		<br/>
	 * 		<b>false</b>:下载失败
	 */
public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		OutputStream os = null;
		try {
			// 连接至服务器,端口默认为21时,可直接通过URL连接
			ftp.connect(url ,port);
			// 登录服务器
			ftp.login(userName, password);
			// 判断返回码是否合法
			if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
				// 不合法时断开连接
				ftp.disconnect();
				// 结束程序
				return result;
			}
			// 设置文件操作目录
			ftp.changeWorkingDirectory(remotePath);
			// 设置文件类型,二进制
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 设置缓冲区大小
			ftp.setBufferSize(3072);
			// 设置字符编码
			ftp.setControlEncoding("UTF-8");
			// 构造本地文件对象
			File localFile = new File(localPath + "/" + fileName);
			System.out.println(localFile);
			// 获取文件操作目录下所有文件名称
			String[] remoteNames = ftp.listNames();
			// 循环比对文件名称,判断是否含有当前要下载的文件名
			for (String remoteName: remoteNames) {
				if (fileName.equals(remoteName)) {
					result = true;
				}
			}
			// 文件名称比对成功时,进入下载流程
			if (result) {
				// 构造文件输出流
				os = new FileOutputStream(localFile);
				// 下载文件
				result = ftp.retrieveFile(fileName, os);
				// 关闭输出流
				os.close();
			}
			// 登出服务器
			ftp.logout();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 判断输出流是否存在
				if (null != os) {
					// 关闭输出流
					os.close();
				}
				// 判断连接是否存在
				if (ftp.isConnected()) {
					// 断开连接
					ftp.disconnect();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return result;
	}

D,删除方法

/**
	 * 从FTP服务器删除文件
	 * 
	 * @param url
	 * 		服务器IP地址
	 * @param port
	 * 		服务器端口
	 * @param userName
	 * 		用户登录名
	 * @param password
	 * 		用户登录密码
	 * @param remotePath
	 * 		服务器文件存储路径
	 * @param fileName
	 * 		服务器文件存储名称
	 * @return
	 * 		<b>true</b>:删除成功
	 * 		<br/>
	 * 		<b>false</b>:删除失败
	 */
public static boolean deleteFile (String url, int port, String userName, String password, String remotePath, String fileName) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			// 连接至服务器,端口默认为21时,可直接通过URL连接
			ftp.connect(url ,port);
			// 登录服务器
			ftp.login(userName, password);
			// 判断返回码是否合法
			if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
				// 不合法时断开连接
				ftp.disconnect();
				// 结束程序
				return result;
			}
			// 设置文件操作目录
			ftp.changeWorkingDirectory(remotePath);
			// 设置文件类型,二进制
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 设置缓冲区大小
			ftp.setBufferSize(3072);
			// 设置字符编码
			ftp.setControlEncoding("UTF-8");
			// 获取文件操作目录下所有文件名称
			String[] remoteNames = ftp.listNames();
			// 循环比对文件名称,判断是否含有当前要下载的文件名
			for (String remoteName: remoteNames) {
				if (fileName.equals(remoteName)) {
					result = true;
				}
			}
			// 文件名称比对成功时,进入删除流程
			if (result) {
				// 删除文件
				result = ftp.deleteFile(fileName);
			}
			// 登出服务器
			ftp.logout();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 判断连接是否存在
				if (ftp.isConnected()) {
					// 断开连接
					ftp.disconnect();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return result;
	}	
 

E,测试

	public static void main(String[] args) throws FileNotFoundException {
//		try {
//			FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/软件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));
//			System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", RandomUUID.random() + ".zip", fis));
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		}
		
		/*File file = new File("F:/vtour1/vtour1/tour.xml");
		InputStream is = new FileInputStream(file);*/
		String path = "092925dc-f071-4170-a2e8-6ff9e7cf2d52.jpg";
		InputStream is = new FileInputStream(new File("C:/Users/Desktop/1.png"));
		System.out.println( FTPUtils.storeFile("192.168.100.21", 21, "administrator", "J94gj123", "Image", path, is));
		//System.out.println(storeFile("192.168.100.22", 21, "app", "111111", "app/1/2/3", "tour.xml", is));
		//System.out.println(retrieveFile("192.168.100.22", 21, "app", "111111", "app", "tour.xml", "D:/dubbo"));
		//System.out.println(deleteFile("127.0.0.1", 21, "feili", "feili", "testpath", "1.txt"));
 
	}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司徒剑南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值