java远程上传文件或者文件夹到ftp服务器

1.上传或者下载单个文件

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

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

/**
 * Created by admin on 2019/1/11.
 */
public class utilFtpOneFile {
	private static FTPClient ftpClient = new FTPClient();
	private static String encoding = System.getProperty("file.encoding");

	/**
	 * 测试ftp单个文件的上传和下载
	 * @param args
	 */
	public static void main(String[] args) {
		utilFtpOneFile fa = new utilFtpOneFile();
		fa.testDownFile();
		fa.testUpLoadFromDisk();
	}
	/**
	 * Description: 向FTP服务器上传文件
	 * @param url  FTP服务器hostname
	 * @param port FTP服务器端口
	 * @param username   FTP登录账号
	 * @param password  FTP登录密码
	 * @param path   FTP服务器保存目录,如果是根目录则为“/”
	 * @param filename  上传到FTP服务器上的文件名
	 * @param input  本地文件输入流
	 * @return 成功返回true,否则返回false
	 */
	public static boolean uploadFile(String url, int port, String username, String password, String path, String filename, InputStream input) {
		boolean result = false;
		try {
			int reply;
			// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftpClient.connect(url);
			// ftp.connect(url, port);// 连接FTP服务器
			// 登录
			ftpClient.login(username, password);
			ftpClient.setControlEncoding(encoding);
			// 检验是否连接成功
			reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				System.out.println("连接失败");
				ftpClient.disconnect();
				return result;
			}

			// 转移工作目录至指定目录下
			boolean change = ftpClient.changeWorkingDirectory(path);
			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
			if (change) {
				result = ftpClient.storeFile(new String(filename.getBytes(encoding),"iso-8859-1"), input);
				if (result) {
					System.out.println("上传成功!");
				}
			}
			input.close();
			ftpClient.logout();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (Exception ioe) {
				}
			}
		}
		return result;
	}
	/**
	 * 将本地文件上传到FTP服务器上
	 *
	 */
	public void testUpLoadFromDisk() {
		try {
			FileInputStream in = new FileInputStream(new File("本地文件地址"));
			boolean flag = uploadFile("ftp主机地址", 端口, "用户名","密码", "上传到ftp服务器的地址", "文件名", in);
			System.out.println(flag);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	/**
	 * Description: 从FTP服务器下载文件
	 * @param url   FTP服务器hostname
	 * @param port  FTP服务器端口
	 * @param username  FTP登录账号
	 * @param password  FTP登录密码
	 * @param remotePath  FTP服务器上的相对路径
	 * @param fileName   要下载的文件名
	 * @param localPath 下载后保存到本地的路径
	 * @return
	 */
	public static boolean downFile(String url, int port, String username,String password, String remotePath, String fileName, String localPath) {
		boolean result = false;
		try {
			int reply;
			ftpClient.setControlEncoding(encoding);
            /*
             *  为了上传和下载中文文件,有些地方建议使用以下两句代替
             *  new String(remotePath.getBytes(encoding),"iso-8859-1")转码。
             *  经过测试,通不过。
             */
			//            FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
			//            conf.setServerLanguageCode("zh");

			ftpClient.connect(url, port);
			// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftpClient.login(username, password);// 登录
			// 设置文件传输类型为二进制
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 获取ftp登录应答代码
			reply = ftpClient.getReplyCode();
			// 验证是否登陆成功
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				System.err.println("FTP server refused connection.");
				return result;
			}
			// 转移到FTP服务器目录至指定的目录下
			ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding),"iso-8859-1"));
			// 获取文件列表
			FTPFile[] fs = ftpClient.listFiles();
			for (FTPFile ff : fs) {
				if (ff.getName().equals(fileName)) {
					File localFile = new File(localPath + "/" + ff.getName());
					OutputStream is = new FileOutputStream(localFile);
					ftpClient.retrieveFile(ff.getName(), is);
					is.close();
				}
			}
			ftpClient.logout();
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (Exception ioe) {
				}
			}
		}
		return result;
	}

	/**
	 * 将FTP服务器上文件下载到本地
	 *
	 */
	public void testDownFile() {
		try {
			boolean flag = downFile("ftp主机地址", 端口, "用户名", "密码", "要下载的文件在ftp上的地址", "文件名", "下载到本地的路径");
			System.out.println(flag);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}

2.上传或者下载整个文件夹

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.TimeZone;
/**
 * Created by admin on 2019/1/11.
 */
public class utilFtpAllFile {
	private FTPClient ftpClient;
	private String strIp;
	private int intPort;
	private String user;
	private String password;

	private static Logger logger = Logger.getLogger(utilFtpAllFile.class.getName());

	public static void main(String[] args) throws IOException {
		utilFtpAllFile ftp=new utilFtpAllFile("frp主机地址",端口,"用户名","密码");
		ftp.ftpLogin();
		System.out.println("1");
		//上传文件夹
		boolean uploadFlag = ftp.uploadDirectory("要上传的文件夹的地址", "上传到ftp的目录"); //如果是admin/那么传的就是所有文件,如果只是/那么就是传文件夹
		System.out.println("uploadFlag : " + uploadFlag);
		//下载文件夹
		ftp.downLoadDirectory("要下载到本地的地址", "要下载的文件夹在ftp的地址");
		ftp.ftpLogOut();
	}

	/**
	 * @return 判断是否登入成功
	 * */
	public boolean ftpLogin() {
		boolean isLogin = false;
		FTPClientConfig ftpClientConfig = new FTPClientConfig();
		ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID());
		this.ftpClient.setControlEncoding("GBK");
		this.ftpClient.configure(ftpClientConfig);
		try {
			if (this.intPort > 0) {
				this.ftpClient.connect(this.strIp, this.intPort);
			}else {
				this.ftpClient.connect(this.strIp);
			}
			// FTP服务器连接回答
			int reply = this.ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				this.ftpClient.disconnect();
				logger.error("登录FTP服务失败!");
				return isLogin;
			}
			this.ftpClient.login(this.user, this.password);
			// 设置传输协议
			this.ftpClient.enterLocalPassiveMode();
			this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			logger.info("恭喜" + this.user + "成功登陆FTP服务器");
			isLogin = true;
		}catch (Exception e) {
			e.printStackTrace();
			logger.error(this.user + "登录FTP服务失败!" + e.getMessage());
		}
		this.ftpClient.setBufferSize(1024 * 2);
		this.ftpClient.setDataTimeout(30 * 1000);
		return isLogin;
	}

	/**
	 * @退出关闭服务器链接
	 * */
	public void ftpLogOut() {
		if (null != this.ftpClient && this.ftpClient.isConnected()) {
			try {
				boolean reuslt = this.ftpClient.logout();// 退出FTP服务器
				if (reuslt) {
					logger.info("成功退出服务器");
				}
			}catch (IOException e) {
				e.printStackTrace();
				logger.warn("退出FTP服务器异常!" + e.getMessage());
			}finally {
				try {
					this.ftpClient.disconnect();// 关闭FTP服务器的连接
				}catch (IOException e) {
					e.printStackTrace();
					logger.warn("关闭FTP服务器的连接异常!");
				}
			}
		}
	}

	/***
	 * 上传Ftp文件
	 * @param localFile 当地文件
	 * @param romotUpLoadePath 上传服务器路径 - 应该以/结束
	 * */
	public boolean uploadFile(File localFile, String romotUpLoadePath) {
		BufferedInputStream inStream = null;
		boolean success = false;
		try {
			this.ftpClient.changeWorkingDirectory(romotUpLoadePath);// 改变工作路径
			inStream = new BufferedInputStream(new FileInputStream(localFile));
			logger.info(localFile.getName() + "开始上传.....");
			success = this.ftpClient.storeFile(localFile.getName(), inStream);
			if (success == true) {
				logger.info(localFile.getName() + "上传成功");
				return success;
			}
		}catch (FileNotFoundException e) {
			e.printStackTrace();
			logger.error(localFile + "未找到");
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			if (inStream != null) {
				try {
					inStream.close();
				}catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return success;
	}

	/***
	 * 下载文件
	 * @param remoteFileName   待下载文件名称
	 * @param localDires 下载到当地那个路径下
	 * @param remoteDownLoadPath remoteFileName所在的路径
	 * */

	public boolean downloadFile(String remoteFileName, String localDires,String remoteDownLoadPath) {
		String strFilePath = localDires + remoteFileName;
		BufferedOutputStream outStream = null;
		boolean success = false;
		try {
			this.ftpClient.changeWorkingDirectory(remoteDownLoadPath);
			outStream = new BufferedOutputStream(new FileOutputStream(strFilePath));
			logger.info(remoteFileName + "开始下载....");
			success = this.ftpClient.retrieveFile(remoteFileName, outStream);
			if (success == true) {
				logger.info(remoteFileName + "成功下载到" + strFilePath);
				return success;
			}
		}catch (Exception e) {
			e.printStackTrace();
			logger.error(remoteFileName + "下载失败");
		}finally {
			if (null != outStream) {
				try {
					outStream.flush();
					outStream.close();
				}catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		if (success == false) {
			logger.error(remoteFileName + "下载失败!!!");
		}
		return success;
	}

	/***
	 * @上传文件夹
	 * @param localDirectory
	 *            当地文件夹
	 * @param remoteDirectoryPath
	 *            Ftp 服务器路径 以目录"/"结束
	 * */
	public boolean uploadDirectory(String localDirectory,
	                               String remoteDirectoryPath) {
		File src = new File(localDirectory);
		try {
			remoteDirectoryPath = remoteDirectoryPath + src.getName() + "/";
			boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath);
			System.out.println("localDirectory : " + localDirectory);
			System.out.println("remoteDirectoryPath : " + remoteDirectoryPath);
			System.out.println("src.getName() : " + src.getName());
			System.out.println("remoteDirectoryPath : " + remoteDirectoryPath);
			System.out.println("makeDirFlag : " + makeDirFlag);
			// ftpClient.listDirectories();
		}catch (IOException e) {
			e.printStackTrace();
			logger.info(remoteDirectoryPath + "目录创建失败");
		}
		File[] allFile = src.listFiles();
		for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
			if (!allFile[currentFile].isDirectory()) {
				String srcName = allFile[currentFile].getPath().toString();
				uploadFile(new File(srcName), remoteDirectoryPath);
			}
		}
		for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
			if (allFile[currentFile].isDirectory()) {
				// 递归
				uploadDirectory(allFile[currentFile].getPath().toString(),
				                remoteDirectoryPath);
			}
		}
		return true;
	}

	/***
	 * @下载文件夹
	 * @param localDirectoryPath 本地地址
	 * @param remoteDirectory 远程文件夹
	 * */
	public boolean downLoadDirectory(String localDirectoryPath,String remoteDirectory) {
		try {
			String fileName = new File(remoteDirectory).getName();
			localDirectoryPath = localDirectoryPath + fileName + "//";
			new File(localDirectoryPath).mkdirs();
			FTPFile[] allFile = this.ftpClient.listFiles(remoteDirectory);
			for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
				if (!allFile[currentFile].isDirectory()) {
					downloadFile(allFile[currentFile].getName(),localDirectoryPath, remoteDirectory);
				}
			}
			for (int currentFile = 0;currentFile < allFile.length;currentFile++) {
				if (allFile[currentFile].isDirectory()) {
					String strremoteDirectoryPath = remoteDirectory + "/"+ allFile[currentFile].getName();
					downLoadDirectory(localDirectoryPath,strremoteDirectoryPath);
				}
			}
		}catch (IOException e) {
			e.printStackTrace();
			logger.info("下载文件夹失败");
			return false;
		}
		return true;
	}
	// FtpClient的Set 和 Get 函数
	public FTPClient getFtpClient() {
		return ftpClient;
	}
	public void setFtpClient(FTPClient ftpClient) {
		this.ftpClient = ftpClient;
	}
	/* *
		 * Ftp构造函数
		 */
	public utilFtpAllFile(String strIp, int intPort, String user, String Password) {
		this.strIp = strIp;
		this.intPort = intPort;
		this.user = user;
		this.password = Password;
		this.ftpClient = new FTPClient();
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值