maven依赖
<!--ftp-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
工具类
import java.io.*;
import org.apache.commons.io.IOUtils;
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;
/**
*
* @author XXX 2017-07-07
*
*/
public class FtpUtil {
/**
* 下载文件
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器文件目录
* @param filename weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20
* @param localpath 下载后的文件路径
* @return
*/
public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
//ftp中文编码格式设置
String LOCAL_CHARSET="GBK";
try {
try {
ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
} catch (Exception e) {
throw new Exception("login ftp error!");
}
//设置ftp编码格式
ftpClient.setControlEncoding(LOCAL_CHARSET);
//切换FTP目录
pathname=new String(pathname.getBytes("GBK"),"iso-8859-1");//如果目录名有中文则做编码格式转换
if (!ftpClient.changeWorkingDirectory(pathname)) {// 如果不能进入dir下,说明此目录不存在!
System.out.println("创建文件目录【"+pathname+"】 失败!");
return flag;
}
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
file.setName(new String(file.getName().getBytes("GBK"),"iso-8859-1"));//如果文件名名有中文则做编码格式转换
File localFile = new File(localpath);
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
/**
* 上传文件(可供Action/Controller层使用)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param fileName 上传到FTP服务器后的文件名称
* @param inputStream 输入文件流
* @return
*/
public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");
try {
try {
ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
} catch (Exception e) {
throw new Exception("connect ftp error!");
}
//pathname=new String(pathname.getBytes("UTF-8"),"iso-8859-1");//如果目录名有中文则做编码格式转换
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
if (!ftpClient.changeWorkingDirectory(pathname)) {// 如果不能进入dir下,说明此目录不存在!
if (!ftpClient.makeDirectory(pathname)) {
System.out.println("创建文件目录【"+pathname+"】 失败!");
}
}
ftpClient.enterLocalPassiveMode();
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 上传文件(可对文件进行重命名)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param filename 上传到FTP服务器后的文件名称
* @param originfilename 待上传文件的名称(绝对地址)
* @return
*/
public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){
boolean flag = false;
try {
InputStream inputStream = new FileInputStream(new File(originfilename));
flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);
System.out.println(flag);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 上传文件(不可以进行文件的重命名操作)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param originfilename 待上传文件的名称(绝对地址)
* @return
*/
public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){
boolean flag = false;
try {
String fileName = new File(originfilename).getName();
InputStream inputStream = new FileInputStream(new File(originfilename));
flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);
System.out.println(flag);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 删除文件
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param filename 要删除的文件名称
* @return
*/
public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
try {
try {
ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
} catch (Exception e) {
throw new Exception("login ftp error!");
}
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
private FTPClient newFtpClient(String host, String user, String pwd) throws Exception {
FTPClient ftp = new FTPClient();
//ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
int reply;
ftp.connect(host);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
throw new Exception("Exception in connecting to FTP Server");
}
ftp.login(user, pwd);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
return ftp;
}
/**
* 根据地址直接获取文件内容
* @param absp
* @return
*/
public byte[] getFile(String absp,String Host,String Username,String Password) {
byte[] ret = null;
try {
FTPClient ftp = newFtpClient(Host, Username, Password);
InputStream is = ftp.retrieveFileStream(absp);
if (is != null) {
ret = IOUtils.toByteArray(is);
is.close();
}else{
System.out.println("找不到文件");
}
} catch (Exception e) {
ret = null;
}
return ret;
}
//可以将获取的byte[] 转换城base64字符串
Base64.getEncoder().encode(ret)
}