===============================================================
package com.suning.search.admin.web.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.apache.commons.io.FileUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ftp下载文件类
*
*
*/
public class FtpUtils {
private final static Logger logger = LoggerFactory.getLogger(FtpUtils.class);
private String ftpUrl;
private String ftpAccount;
private String ftpPassword;
public final static String BI_TEMP_FILE = "/opt/search/admin/bi/";
static {
File biDir = new File(BI_TEMP_FILE);
if (!biDir.exists()) {
biDir.mkdirs();
}
}
public FtpUtils() {
super();
}
public FtpUtils(String ftpUrl, String ftpAccount, String ftpPassword) {
super();
this.ftpUrl = ftpUrl;
this.ftpAccount = ftpAccount;
this.ftpPassword = ftpPassword;
}
public String downloadFile(String path, String fileName, String localPath) {
FTPClient fc = new FTPClient();
String ret = null;
try {
fc.connect(ftpUrl);
fc.user(ftpAccount);
fc.pass(ftpPassword);
logger.info("链接服务器:" + fc.isConnected());
logger.info("切换目录:" + fc.changeWorkingDirectory(path));
FTPFile[] files = fc.listFiles();
File dir = new File(localPath);
if (!dir.exists()) {
dir.mkdir();
}
for (FTPFile file : files) {
if (file.getName().startsWith((fileName))) {
logger.info("开始下载:" + file.getName());
long begin = System.currentTimeMillis();
File localFile = new File(localPath + file.getName());
if (!localFile.exists()) {
localFile.createNewFile();
}
OutputStream is = new FileOutputStream(localFile);
fc.retrieveFile(file.getName(), is);
is.close();
ret = file.getName();
logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
}
}
} catch (SocketException e) {
logger.error("下载BI文件时出现错误", e);
} catch (IOException e) {
logger.error("下载BI文件时出现错误", e);
}
return ret;
}
public boolean uploadFile(String path, String fileName, String localFile) {
FTPClient fc = new FTPClient();
boolean result = true;// 文件上传是否成功
try {
fc.connect(ftpUrl);
fc.user(ftpAccount);
fc.pass(ftpPassword);
logger.info("链接服务器:" + fc.isConnected());
logger.info("切换目录:" + path + " : " + changeDirectory(path, fc));
FTPFile[] files = fc.listFiles();
for (FTPFile ftpFile : files) {
if (ftpFile.isFile() && ftpFile.getName().equals(fileName)) {
fc.deleteFile(ftpFile.getName());
}
}
InputStream input = new FileInputStream(localFile);
result = fc.storeFile(fileName, input);
input.close();
} catch (SocketException e) {
logger.error("下载BI文件时出现错误", e);
} catch (IOException e) {
logger.error("下载BI文件时出现错误", e);
}
return result;
}
public void removeFiles(String path) {
FTPClient fc = new FTPClient();
try {
fc.connect(ftpUrl);
fc.user(ftpAccount);
fc.pass(ftpPassword);
logger.info("链接服务器:" + fc.isConnected());
logger.info("切换目录:" + fc.changeWorkingDirectory(path));
FTPFile[] files = fc.listFiles();
for (FTPFile file : files) {
if (file.isFile()) {
fc.deleteFile(file.getName());
}
}
} catch (SocketException e) {
logger.error("删除文件时出现错误", e);
} catch (IOException e) {
logger.error("删除文件时出现错误", e);
}
}
/**
* 通过前缀下载文件
*
* @param preStr 前缀
* @return 文件名
*/
public String downloadFiles(String preStr, String localPath) {
FTPClient fc = new FTPClient();
try {
fc.connect(ftpUrl);
fc.user(ftpAccount);
fc.pass(ftpPassword);
logger.info("链接服务器:" + fc.isConnected());
logger.info("切换目录:" + fc.changeWorkingDirectory("/etldata/output/net_search"));
FTPFile[] files = fc.listFiles();
logger.info("开始处理前缀为" + preStr + "的CSV文件");
String fileName = getFileName(preStr);
File dir = new File(localPath);
if (!dir.exists()) {
dir.mkdir();
}
for (FTPFile file : files) {
if (file.getName().equals(fileName)) {
logger.info("开始下载:" + file.getName());
long begin = System.currentTimeMillis();
File localFile = new File(localPath + fileName);
if (!localFile.exists()) {
localFile.createNewFile();
}
OutputStream is = new FileOutputStream(localFile);
fc.retrieveFile(file.getName(), is);
is.close();
logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
}
}
return fileName;
} catch (SocketException e) {
logger.error("下载BI文件时出现错误", e);
} catch (IOException e) {
logger.error("下载BI文件时出现错误", e);
}
return null;
}
/**
* 通过前缀下载文件
*
* @param preStr 前缀
* @return 文件名
*/
public String downloadFiles(String preStr) {
FTPClient fc = new FTPClient();
try {
fc.connect(ftpUrl);
fc.user(ftpAccount);
fc.pass(ftpPassword);
logger.info("链接服务器:" + fc.isConnected());
logger.info("切换目录:" + fc.changeWorkingDirectory("/etldata/output/net_search"));
FTPFile[] files = fc.listFiles();
logger.info("开始处理前缀为" + preStr + "的CSV文件");
String fileName = getFileName(preStr);
File dir = new File(BI_TEMP_FILE);
if (!dir.exists()) {
dir.mkdir();
}
for (FTPFile file : files) {
if (file.getName().equals(fileName)) {
logger.info("开始下载:" + file.getName());
long begin = System.currentTimeMillis();
File localFile = new File(BI_TEMP_FILE + fileName);
if (!localFile.exists()) {
localFile.createNewFile();
}
OutputStream is = new FileOutputStream(localFile);
fc.retrieveFile(file.getName(), is);
is.close();
logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
}
}
return fileName;
} catch (SocketException e) {
logger.error("下载BI文件时出现错误", e);
} catch (IOException e) {
logger.error("下载BI文件时出现错误", e);
}
return null;
}
public String[] downloadMonthFiles(String preStr) {
FTPClient fc = new FTPClient();
try {
fc.connect(ftpUrl);
fc.user(ftpAccount);
fc.pass(ftpPassword);
logger.info("链接服务器:" + fc.isConnected());
logger.info("切换目录:" + fc.changeWorkingDirectory("/etldata/output/net_search"));
FTPFile[] files = fc.listFiles();
logger.info("开始处理前缀为" + preStr + "的CSV文件");
String[] fileNames = getMonthFileNames(preStr);
for (String fileName : fileNames) {
for (FTPFile file : files) {
if (file.getName().equals(fileName)) {
logger.info("开始下载:" + file.getName());
long begin = System.currentTimeMillis();
File localFile = new File(BI_TEMP_FILE + fileName);
if (!localFile.exists()) {
localFile.createNewFile();
}
OutputStream is = new FileOutputStream(localFile);
fc.retrieveFile(file.getName(), is);
is.close();
logger.info("下载结束,耗时:" + (System.currentTimeMillis() / 1000 - begin / 1000) + "秒");
}
}
}
return fileNames;
} catch (SocketException e) {
logger.error("下载BI文件时出现错误", e);
} catch (IOException e) {
logger.error("下载BI文件时出现错误", e);
}
return null;
}
// ftp切换目录,不存在就创建
public boolean changeDirectory(String path, FTPClient ftp) {
FTPFile[] files;
boolean result = false;
String[] str = path.split("/");
for (String s : str) {
try {
boolean exist = false;// 路径是否存在
files = ftp.listFiles();
for (FTPFile f : files) {
if (f.isDirectory() && !"".equals(s) && f.getName().equals(s)) {
exist = true;
}
}
if (!exist) {
ftp.makeDirectory(s);
}
result = ftp.changeWorkingDirectory(s);
} catch (IOException e) {
logger.error("连接FTP异常", e);
}
}
return result;
}
@SuppressWarnings("deprecation")
public String getFileName(String preStr) {
Date date = new Date();
date.setDate(date.getDate() - 1);
String fileName = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
fileName = preStr + sdf.format(date) + ".CSV";
return fileName;
}
public String[] getMonthFileNames(String preStr) {
Calendar calendar = new GregorianCalendar();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
Calendar currentDay = new GregorianCalendar(year, month, day);
String[] fileNames = new String[30];
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
for (int i = 0; i < fileNames.length; i++) {
fileNames[i] = preStr + sdf.format(currentDay.getTime()) + ".CSV";
logger.info(fileNames[i]);
currentDay.add(Calendar.DATE, -1);
}
return fileNames;
}
public void deleteFiles() {
File dir = new File(BI_TEMP_FILE);
File[] files = dir.listFiles();
for (File file : files) {
FileUtils.deleteQuietly(file);
}
}
public String getFtpUrl() {
return ftpUrl;
}
public void setFtpUrl(String ftpUrl) {
this.ftpUrl = ftpUrl;
}
public String getFtpAccount() {
return ftpAccount;
}
public void setFtpAccount(String ftpAccount) {
this.ftpAccount = ftpAccount;
}
public String getFtpPassword() {
return ftpPassword;
}
public void setFtpPassword(String ftpPassword) {
this.ftpPassword = ftpPassword;
}
}
=====================================================
http://www.cxyclub.cn/n/10536/
1、远程FTP服务连接
2、FTP上传文件
3、FTP下载文件,注意:在下载多个文件时,必须执行:ftpClient.completePendingCommand();否则,is = ftpClient.retrieveFileStream(file.getName());返回NUll
4、FTP文件的删除
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
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;
/**
* ftp上传下载类
* @author
*
*/
public class BankReceiptFTPUtil {
private Logger logger = Logger.getLogger(BankReceiptFTPUtil.class);
private String ip ;
private int port;
private String pwd;
private String user;
private FTPClient ftpClient;
public BankReceiptFTPUtil(String ip, int port, String user, String pwd) {
this.ip = ip;
this.port = port;
this.user = user;
this.pwd = pwd;
}
/**
* 连接FTP服务器
* @param ip ip地址
* @param port 端口号
* @param user 用户名
* @param pwd 密码
* @return
* @throws Exception
*/
public boolean connectServer(String ip, int port, String user, String pwd) throws Exception {
boolean isSuccess = false;
try {
ftpClient = new FTPClient();
ftpClient.connect(ip, port);
ftpClient.setControlEncoding("GBK");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
ftpClient.login(user, pwd);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
isSuccess = true;
} else {
ftpClient.disconnect();
logger.error("连接ftp服务器异常!");
throw new BossOperException();
}
} catch (Exception e) {
logger.error("连接FTP服务器异常.." ,e);
}
return isSuccess ;
}
/**
* 远程FTP下载文件
* @param remotePath
* @param localPath
* @param fileName
* @return
* @throws Exception
*/
public List<File> downloadFile(String remotePath, String localPath, List<File> files) throws Exception {
List<File> result = new ArrayList<File>();
File fileOut = null ;
InputStream is = null ;
FileOutputStream os = null ;
try {
if(connectServer(this.getIp(), this.getPort(), this.getUser(), this.getPwd())) {
ftpClient.changeWorkingDirectory(remotePath);
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles) {
is = ftpClient.retrieveFileStream(file.getName());
if(localPath != null && !localPath.endsWith(File.separator)) {
localPath = localPath + File.separator;
File path = new File(localPath);
if(!path.exists()) {
path.mkdirs();
}
}
fileOut = new File(localPath + file.getName());
os = new FileOutputStream(fileOut);
byte[] bytes = new byte[1024];
int c ;
while((c=is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
result.add(fileOut);
ftpClient.completePendingCommand();
os.flush();
is.close();
os.close();
}
for(FTPFile file : ftpFiles) {
ftpClient.deleteFile(file.getName());
}
}
} catch(Exception e) {
logger.error("从FTP服务器下载文件异常:", e);
} finally {
ftpClient.logout();
if(ftpClient.isConnected()) {
ftpClient.disconnect();
}
}
return result;
}
/**
* FTP上传文件
* @param remotePath
* @param localPath
* @param files
* @return
* @throws Exception
*/
public File uploadFile(String remotePath, List<File> files) throws Exception {
File fileIn = null;
OutputStream os = null;
FileInputStream is = null;
try {
for(File file : files) {
if(connectServer(this.getIp(), this.getPort(), this.getUser(), this.getPwd())) {
ftpClient.changeWorkingDirectory(remotePath);
os = ftpClient.storeFileStream(file.getName());
fileIn = file;
is = new FileInputStream(fileIn);
byte[] bytes = new byte[1024];
int c ;
while((c=is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
}
}
} catch(Exception e) {
logger.error("上传FTP文件异常: ", e);
} finally {
os.close() ;
is.close();
ftpClient.logout();
if(ftpClient.isConnected()) {
ftpClient.disconnect();
}
}
return fileIn;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}