FTP文件上传和下载(JAVA)

前文

      1、使用FTP的方式进行文件的上传和下载(非SFTP)

      2、本人手打,亲测,代码是最简单的,清晰易懂,需要的同学请结合自己的实际添加业务逻辑

      2、第三方的jar包:import org.apache.commons.net.ftp.FTPClient;

代码

package Main;

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.List;

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

import Domain.FileInfoList;
import Domain.FtpConfig;
import Util.LoggerUtil;

public class FTPUtils {
	public static final String ftp_IP = "192.168.0.6";
	public static final Integer ftp_port = 9001;
	public static final String ftp_user = "Administrator";
	public static final String ftp_psw = "123";

	public static void main(String args[]) {
		//download from FTP
		downloadFromFTP(ftp_IP,ftp_port,ftp_user,ftp_psw,"/","新建文本文档.txt","E:");
		//upload from FTP
		uploadFromFTP(ftp_IP,ftp_port,ftp_user,ftp_psw,"/","E://新建文本文档.txt","新建文本文档.txt");
	}
	/**
	 * @param url        IP
	 * @param port       端口
	 * @param username   用户名
	 * @param password   密码
	 * @param remotePath 服务器上的路径
	 * @param fileName   要下载的文件
	 * @param localPath  保存到本地的文件
	 */
	public static boolean downloadFromFTP(String url, int port, String username, String password, String remotePath,
			String fileName, String localPath) {
		boolean success = false;
		FTPClient ftp = new FTPClient();
		InputStream input=null;
		BufferedOutputStream writer=null;
		byte[] by=null;
		try {
			int reply;
			ftp.connect(url, port);
			// ftp.connect(url);
			// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			ftp.enterLocalPassiveMode();
			ftp.setControlEncoding("gbk");
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return success;
			}
			ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
			FTPFile[] fs = ftp.listFiles(); // 获取当前目录下的所有文件

			for (FTPFile ff : fs) {
				if (new String(ff.getName().getBytes(),"utf-8").equals(fileName)) {
					//防止出现中文文件名是返回null,强制设置成ISO-8859-1的编码方式进行获取输入流
					input=ftp.retrieveFileStream("/"+(new String(ff.getName().getBytes("gbk"), "ISO-8859-1")));
					by=new byte[(int)ff.getSize()];
					//把文件流保存到byte数组中
					input.read(by);
					//文件输出到目标目录,不需要判断本地目录是否有相同文件,会自动覆盖
					writer=new BufferedOutputStream(new FileOutputStream(localPath+"/"+fileName));
					writer.write(by);
					System.out.println("输出指定文件【"+fileName+"】到本地目录:"+localPath+"/"+fileName+"成功");
				}
			}
			//断开FTP连接
			ftp.logout();
			success = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			
			if (ftp.isConnected()) {
				try {
					if(writer!=null) {
						writer.close();
					}
					if(input!=null) {
						input.close();
					}
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return success;
	}
	
	/**
	 * ftp上传单个文件
	 * 
	 * @param ftpIP      ftp地址
	 * @param port        端口号
	 * @param userName    ftp的用户名
	 * @param password    ftp的密码
	 * @param directory   上传至ftp的路径名不包括文件名
	 * @param localFilePath 要上传的本地文件全路径名
	 * @param destName    上传至ftp后存储的文件名
	 * @throws IOException 
	 */
	public static boolean uploadFromFTP(String ftpIP,Integer port,String userName,String password,String directory,String localFilePath,String destName) {


		FTPClient ftpClient = new FTPClient();
		FileInputStream fis = null;
		boolean result = false;
		try {
			ftpClient.connect(ftpIP, port);
			ftpClient.login(userName, password);
			ftpClient.enterLocalPassiveMode();
			// 设置上传目录
			ftpClient.changeWorkingDirectory(directory);
			ftpClient.setBufferSize(1024);
			ftpClient.setConnectTimeout(10*1000);
			ftpClient.setControlEncoding("gbk");
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			//防止出现中文文件名是返回null,强制把文件名设置成ISO-8859-1的编码方式进行删除指定文件
			ftpClient.deleteFile(directory+new String(destName.getBytes("gbk"),"ISO-8859-1"));
			File srcFile = new File(localFilePath);
			fis = new FileInputStream(srcFile);
			//上传到FTP服务器==防止出现中文文件名是返回null,强制把文件名设置成ISO-8859-1的编码方式进行上传
			result = ftpClient.storeFile((directory + new String(destName.getBytes("gbk"),"ISO-8859-1")), fis);

		} catch (NumberFormatException e) {
			System.err.println("FTP端口配置错误:不是数字:");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeQuietly(fis);
			try {
				ftpClient.disconnect();
			} catch (IOException e) {
				throw new RuntimeException("关闭FTP连接发生异常!", e);
			}
		}
		return result;
	}
}

  

原文地址:https://www.cnblogs.com/hzb462606/p/11084820.html