使用Java连接Ftp并且实现文件的上传下载
1.使用maven工程的话需要引入Maven的pom
<!--连接ftp使用--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.3</version></dependency><!--打印日志使用--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency>
2.使用Java代码实现连接
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.net.SocketException;/*** @wsh* 实现连接FTP服务器,实现文件的上传和下载*/
public class FtpUtils {//打印日志使用private static final Logger log = LoggerFactory.getLogger(FtpUtils.class);/*** 获取FTPClient对象** @param ftpHost* FTP主机服务器* @param ftpPassword* FTP 登录密码* @param ftpUserName* FTP登录用户名* @param ftpPort* FTP端口 默认为21* @return*/public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {FTPClient ftpClient = null;try {//创建一个ftp客户端ftpClient = new FTPClient();// 连接FTP服务器ftpClient.connect(ftpHost, ftpPort);// 登陆FTP服务器ftpClient.login(ftpUserName, ftpPassword);if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {log.info("未连接到FTP,用户名或密码错误。");ftpClient.disconnect();} else {log.info("FTP连接成功。");}} catch (SocketException e) {e.printStackTrace();log.info("FTP的IP地址可能错误,请正确配置。");} catch (IOException e) {e.printStackTrace();log.info("FTP的端口错误,请正确配置。");}return ftpClient;}/*** 下载文件** @param ftpHost ftp服务器地址* @param ftpUserName anonymous匿名用户登录,不需要密码。administrator指定用户登录* @param ftpPassword 指定用户密码* @param ftpPort ftp服务员器端口号* @param ftpPath ftp文件存放物理路径* @param localPath 本地存储文件的路径* @param fileName 文件名称*/public static void downloadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName) {FTPClient ftpClient = null;try {ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);ftpClient.setControlEncoding("UTF-8"); // 中文支持ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.enterLocalPassiveMode();ftpClient.changeWorkingDirectory(ftpPath);File localFile = new File(localPath + File.separatorChar + fileName);OutputStream os = new FileOutputStream(localFile);ftpClient.retrieveFile(fileName, os);os.close();ftpClient.logout();} catch (FileNotFoundException e) {log.error("没有找到" + ftpPath + "文件");e.printStackTrace();} catch (SocketException e) {log.error("连接FTP失败.");e.printStackTrace();} catch (IOException e) {e.printStackTrace();log.error("文件读取错误。");e.printStackTrace();}}/*** 上传文件** @param ftpHost ftp服务器地址* @param ftpUserName anonymous匿名用户登录,不需要密码。administrator指定用户登录* @param ftpPassword 指定用户密码* @param ftpPort ftp服务员器端口号* @param ftpPath ftp文件存放物理路径* @param fileName 文件路径* @param input 文件输入流,即从本地服务器读取文件的IO输入流*/public static void uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String fileName,InputStream input){FTPClient ftp=null;try {ftp=getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);ftp.makeDirectory(ftpPath);ftp.changeWorkingDirectory(ftpPath);ftp.setFileType(FTP.BINARY_FILE_TYPE);fileName=new String(fileName.getBytes("GBK"),"iso-8859-1");ftp.storeFile(fileName, input);input.close();ftp.logout();System.out.println("upload succes!");} catch (Exception e) {e.printStackTrace();}}
}