最近需要用Java向ftp上传下载些东西,特此封装了工具类。可以拿来直接用。
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.InputStream;
public class ftpUtil {
private static Logger log = Logger.getLogger(ftpUtil.class);
/**
* @param ftpHost ftp ip
* @param ftpUserName 用户名
* @param ftpPassword 密码
* @param ftpPort 端口
* @return org.apache.commons.net.ftp.FTPClient
* @description 获取ftpclient对象
* @date 2018/8/19 16:54
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
FTPClient ftpClient = null;
ftpClient = new FTPClient();
try {
ftpClient.connect(ftpHost, ftpPort);//连接ftp服务器
ftpClient.login(ftpUserName, ftpPassword);//登录ftp服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {//ftpClient.getReplyCode()状态码在200到300间 判定登录成功
log.info("未连接到ftp,用户名或密码错误");
ftpClient.disconnect();
} else {
log.info("ftp连接成功");
}
} catch (IOException e) {
log.error("连接ftp服务器出错:", e);
}
return ftpClient;
}
/**
* @param ftpHost ftp ip
* @param ftpPort 端口
* @param ftpUserName 用户名
* @param ftpPassword 密码
* @param ftpPath 路径
* @param fileName 文件名
* @param input 输入流
* @return boolean 成功返回true 失败 false
* @description 上传文件到ftp指定目录
* @date 2018/8/19 17:14
*/
public static boolean uploadFile(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String ftpPath, String fileName, InputStream input) {
boolean flag=true;
try {
FTPClient ftpClient = null;
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.setControlEncoding("UTF-8");//中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
boolean cdflag=ftpClient.changeWorkingDirectory(ftpPath);
log.info("路径切换是否成功:"+cdflag);
//上传文件到指定目录
boolean uploadFlag=ftpClient.storeFile(new String(fileName.getBytes(),"UTF-8"),input);
log.info("文件是否上传成功:"+uploadFlag);
input.close();
//退出ftp
ftpClient.logout();
flag=true;
} catch (IOException e) {
flag=false;
}
return flag;
}
/**
* @author zl
* @description 从ftp下载指定路径下的文件
* @date 2018/8/19 17:38
* @param host
* @param port
* @param username
* @param password
* @param remotePath 路径
* @param fileName 文件名
* @return java.io.InputStream
*/
public static InputStream downFile(String host, int port, String username,
String password, String remotePath, String fileName) {
FTPClient ftp = new FTPClient();
InputStream is = null;
try {
int reply;
try {
ftp.connect(host, port);// 连接FTP服务器
} catch (Exception e) {
log.error("ftp连接失败:",e);
}
try {
ftp.login(username, password);// 登录
} catch (Exception e) {
log.error("ftp登录失败:",e);
}
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
ftp.disconnect();
log.info("未正确连接ftp");
return null;
}
ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
Boolean isFind = true;
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
isFind = false;
is = ftp.retrieveFileStream(ff.getName());
}
}
if (isFind) {
log.info("文件未找到");
}
ftp.logout();
} catch (IOException e) {
log.info("文件下载失败");
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return is;
}
}