package net.eshui.util.ftp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.TimeZone;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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;/**
* @Title:FTPUtil
* @Description:
* @Company:www.eshui.net 提供ftp 上传 下载 ,文件上传和下载需要优化downloadFile()
* uploadDirectory()*/
public classFTPUtil {privateFTPClient ftpClient;privateString IP;private intport;privateString userName;privateString password;private static final Log LOG = LogFactory.getLog(FTPUtil.class);/**
* 构造函数
*
* @param IP
* FTP服务器地址
* @param userName
* FTP服务器用户名
* @param passWord
* FTP服务器密码*/
public FTPUtil(String IP, intport, String userName, String password) {this.IP =IP;this.port =port;this.userName =userName;this.password =password;this.ftpClient = newFTPClient();
}/**
* @return 判断是否登入成功
**/
publicboolean login() {
boolean isLogin= false;
FTPClientConfig ftpClientConfig= newFTPClientConfig();
ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID());//this.ftpClient.setControlEncoding("GBK");
this.ftpClient.configure(ftpClientConfig);try{if (this.port > 0) {this.ftpClient.connect(this.IP, this.port);
}else{this.ftpClient.connect(IP);
}//FTP服务器连接回答
int reply = this.ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {this.ftpClient.disconnect();if(LOG.isDebugEnabled())
LOG.debug("登录FTP服务失败!");returnisLogin;
}this.ftpClient.login(this.userName, this.password);//设置传输协议
this.ftpClient.enterLocalPassiveMode();this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);if(LOG.isDebugEnabled())
LOG.debug("恭喜" + this.userName + "成功登陆FTP服务器");
isLogin= true;
}catch(Exception e) {
LOG.error(this.userName + "登录FTP服务失败!" +e.getMessage());
}this.ftpClient.setBufferSize(1024 * 2);this.ftpClient.setDataTimeout(3 * 1000);returnisLogin;
}/**
* 退出关闭服务器链接*/
public voidlogOut() {if (null != this.ftpClient && this.ftpClient.isConnected()) {try{
boolean reuslt= this.ftpClient.logout();//退出FTP服务器
if(reuslt) {if(LOG.isDebugEnabled())
LOG.debug("成功退出服务器");
}
}catch(IOException e) {
LOG.error("退出FTP服务器异常!" +e.getMessage());
}finally{try{this.ftpClient.disconnect();//关闭FTP服务器的连接
} catch(IOException e) {
LOG.error("关闭FTP服务器的连接异常!");
}
}
}
}/**
* 上传文件
*
* @param localFile
* 本地文件
* @param remoteUpLoadePath
* 上传路径
* @return*/
publicboolean uploadFile(String localFile, String remoteUpLoadePath) {return uploadFile(newFile(localFile), remoteUpLoadePath);
}/***
* 上传Ftp文件
*
* @param localFile
* 当地文件
* @param remoteUpLoadePath上传服务器路径
* - 应该以/结束
**/
publicboolean uploadFile(File localFile, String remoteUpLoadePath) {
BufferedInputStream inStream= null;
boolean success= false;try{
inStream= new BufferedInputStream(newFileInputStream(localFile));
createDirectory(remoteUpLoadePath);//项目集成调用StreamUtil方法来实现
if(LOG.isDebugEnabled())
LOG.debug(localFile.getName()+ "开始上传.....");
success= this.ftpClient.storeFile(localFile.getName(), inStream);if (success == true) {if(LOG.isDebugEnabled())
LOG.debug(localFile.getName()+ "上传成功");returnsuccess;
}
}catch(FileNotFoundException e) {
LOG.error(localFile+ "未找到");
}catch(IOException e) {
LOG.error("上传文件IO出错!" +e.toString());
}finally{if (inStream != null) {try{
inStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnsuccess;
}/***
* 上传Ftp文件
*
* @param localFile
* 当地文件
* @param remoteUpLoadePath上传服务器路径
* - 应该以/结束
**/
publicboolean uploadFile(File localFile, String remoteUpLoadePath,String fileName) {
BufferedInputStream inStream= null;
boolean success= false;try{
inStream= new BufferedInputStream(newFileInputStream(localFile));
createDirectory(remoteUpLoadePath);//项目集成调用StreamUtil方法来实现
if(LOG.isDebugEnabled())
LOG.debug(localFile.getName()+ "开始上传.....");
success= this.ftpClient.storeFile(fileName, inStream);if (success == true) {if(LOG.isDebugEnabled())
LOG.debug(localFile.getName()+ "上传成功");returnsuccess;
}
}catch(FileNotFoundException e) {
LOG.error(localFile+ "未找到");
}catch(IOException e) {
LOG.error("上传文件IO出错!" +e.toString());
}finally{if (inStream != null) {try{
inStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnsuccess;
}/***
* 上传Ftp文件
*
* @param in
* 数据流
* @param remoteUpLoadePath上传服务器路径
* @param file
* 存储名称
* @throws IOException
**/
public boolean uploadFile(String remoteUpLoadePath, String remotefileName, byte[] in) throws IOException {
InputStream inStream= null;
boolean success= false;try{//项目集成调用StreamUtil方法来实现
inStream = ByteArrayInputStream(in);if(LOG.isDebugEnabled())
LOG.debug(remotefileName+ "开始上传.....");this.ftpClient.changeWorkingDirectory(remoteUpLoadePath); //切换到远程目录
success = this.ftpClient.storeFile(remotefileName, inStream);if (success == true) {if(LOG.isDebugEnabled())
LOG.debug(remotefileName+ "上传成功");returnsuccess;
}
}catch(IOException e) {
LOG.error("上传文件IO出错!" +e.toString());
}finally{if (inStream != null) {try{
inStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnsuccess;
}/***
* 上传Ftp文件
*
* @param in
* 数据流
* @param remoteUpLoadePath上传服务器路径
* @param file
* 存储名称
* @throws IOException
**/
publicboolean uploadFile(String remoteUpLoadePath, String remoteFileName, InputStream inStream) throws IOException {//InputStream inStream = null;
boolean success = false;try{//项目集成调用StreamUtil方法来实现//inStream = ByteArrayInputStream(in);
if(LOG.isDebugEnabled())
LOG.debug(remoteFileName+ "开始上传.....");this.ftpClient.changeWorkingDirectory(remoteUpLoadePath); //切换到远程目录
success = this.ftpClient.storeFile(new String(remoteFileName.getBytes("GBK") , "iso-8859-1") , inStream);if (success == true) {if(LOG.isDebugEnabled())
LOG.debug(remoteFileName+ "上传成功");returnsuccess;
}
}catch(IOException e) {
LOG.error("上传文件IO出错!" +e.toString());
}finally{if (inStream != null) {try{
inStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnsuccess;
}/**
* byte 数组 转换流
*
* @param in
* @return*/
private InputStream ByteArrayInputStream(byte[] in) {
ByteArrayInputStreamis = new ByteArrayInputStream(in);return is;
}//项目集成调用StreamUtil方法来实现
private byte[] input2byte(InputStream inStream) throws IOException {
ByteArrayOutputStream swapStream= newByteArrayOutputStream();byte[] buff = new byte[1024];int rc = 0;while ((rc = inStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff,0, rc);
}byte[] in2b =swapStream.toByteArray();returnin2b;
}/***
* 下载文件
*
* @param remoteFileName
* 待下载文件名称
* @param localDires
* 下载到当地那个路径下
* @param remoteDownLoadPath
* remoteFileName所在的路径
**/
publicboolean downloadFile(String localDires, String remoteFileName, String remoteDownLoadPath) {
String strFilePath= converPath(localDires) +remoteFileName;
BufferedOutputStream outStream= null;
boolean success= false;try{this.ftpClient.changeWorkingDirectory(converPath(remoteDownLoadPath));
outStream= new BufferedOutputStream(newFileOutputStream(strFilePath));if(LOG.isDebugEnabled())
LOG.debug(remoteFileName+ "开始下载....");
success= this.ftpClient.retrieveFile(remoteFileName, outStream);if (success == true) {if(LOG.isDebugEnabled())
LOG.debug(remoteFileName+ "成功下载到" +strFilePath);returnsuccess;
}
}catch(Exception e) {
LOG.error(remoteFileName+ "下载失败");
}finally{if (null !=outStream) {try{
outStream.flush();
outStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}if (success == false) {if(LOG.isDebugEnabled())
LOG.debug(remoteFileName+ "下载失败!!!");
}returnsuccess;
}/***
* 下载文件
*
* @param remoteFileName
* 待下载文件名称
* @param localDires
* 下载到当地那个路径下
* @param remoteDownLoadPath
* remoteFileName所在的路径
* @throws IOException
**/
public byte[] downloadFile(String remoteFileName, String remoteDownLoadPath) throws IOException {
InputStream inStream= null;byte[] retBytes = null;try{//Properties prop = System.getProperties();//String os = prop.getProperty("os.name");//if(os.startsWith("win") || os.startsWith("Win")){//remoteDownLoadPath = remoteDownLoadPath.replace("\\","/");//}//boolean b=ftpClient.changeWorkingDirectory("/2016");
this.ftpClient.changeWorkingDirectory(remoteDownLoadPath.trim());if(LOG.isDebugEnabled())
LOG.debug(remoteFileName+ "开始下载....");
inStream= this.ftpClient.retrieveFileStream(remoteFileName.trim());
retBytes=input2byte(inStream);
}catch(Exception e) {
LOG.error(remoteFileName+ "下载失败");
}finally{if (null !=inStream) {try{
inStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnretBytes;
}/***
* @上传文件夹
* @param localDirectory
* 当地文件夹
* @param remoteDirectoryPath
* Ftp 服务器路径 以目录"/"结束
* @throws IOException
* @throws UnsupportedEncodingException
**/
publicboolean uploadDirectory(String localDirectory, String remoteDirectoryPath)
throws UnsupportedEncodingException, IOException {
File src= newFile(localDirectory);
File[] allFile=src.listFiles();for (int currentFile = 0; currentFile < allFile.length; currentFile++) {if (!allFile[currentFile].isDirectory()) {
String srcName=allFile[currentFile].getPath().toString();
uploadFile(newFile(srcName), remoteDirectoryPath);
}
}for (int currentFile = 0; currentFile < allFile.length; currentFile++) {if(allFile[currentFile].isDirectory()) {//递归
String path = converPath(remoteDirectoryPath) +allFile[currentFile].getName();
createDirectory(allFile[currentFile].getName().toString());
uploadDirectory(allFile[currentFile].getPath().toString(), path);
}
}return true;
}/***
* @下载文件夹
* @param localDirectoryPath本地地址
* @param remoteDirectory
* 远程文件夹
**/
publicboolean downLoadDirectory(String localDirectoryPath, String remoteDirectory) {
remoteDirectory=converPath(remoteDirectory);
localDirectoryPath=converPath(localDirectoryPath);try{newFile(localDirectoryPath).mkdirs();
FTPFile[] allFile= this.ftpClient.listFiles(remoteDirectory);for (int currentFile = 0; currentFile < allFile.length; currentFile++) {if (!allFile[currentFile].isDirectory()) {
downloadFile(allFile[currentFile].getName(), localDirectoryPath, remoteDirectory);
}
}for (int currentFile = 0; currentFile < allFile.length; currentFile++) {if(allFile[currentFile].isDirectory()) {
String strRemoteDirectoryPath= converPath(remoteDirectory) +allFile[currentFile].getName();
String strLocalDirectoryPath= converPath(localDirectoryPath) +allFile[currentFile].getName();newFile(converPath(strLocalDirectoryPath)).mkdirs();//this.ftpClient.changeWorkingDirectory(converPath(strRemoteDirectoryPath));
downLoadDirectory(converPath(strLocalDirectoryPath), converPath(strRemoteDirectoryPath));
}
}
}catch(IOException e) {
LOG.error("下载文件夹失败!" +e.toString());return false;
}return true;
}/**
* 根据路径进行创建文件,解决兼容问题
*
* @param path
* @return
* @throws IOException
* @throws UnsupportedEncodingException*/
publicboolean createDirectory(String path) throws UnsupportedEncodingException, IOException {
path=converPath(path);
String directory= path.substring(0, path.lastIndexOf("/") + 1);if (!directory.equalsIgnoreCase("/") && !this.ftpClient.changeWorkingDirectory(directory)) {//如果远程目录不存在,则递归创建远程服务器目录
int start = 0;int end = 0;if (directory.startsWith("/")) {
start= 1;
}else{
start= 0;
}
end= directory.indexOf("/", start);while (true) {
String subDirectory=path.substring(start, end);if (!ftpClient.changeWorkingDirectory(subDirectory)) {if(ftpClient.makeDirectory(subDirectory)) {
ftpClient.changeWorkingDirectory(subDirectory);
}else{if(LOG.isDebugEnabled())
LOG.debug("创建目录失败!");return false;
}
}
start= end + 1;
end= directory.indexOf("/", start);//检查所有目录是否创建完毕
if (end <=start) {break;
}
}
}return true;
}/**
* 增加目录结尾标识“/”
*
* @param path
* @return*/
privateString converPath(String path) {if (!path.trim().endsWith("/"))
path= path + "/";returnpath;
}/**
* 读取图片 文件
*
* @param imgPath
* @return*/
public static byte[] imageToByteArray(String imgPath) {
BufferedInputStreamin;try{in = new BufferedInputStream(newFileInputStream(imgPath));
ByteArrayOutputStreamout = newByteArrayOutputStream();int size = 0;byte[] temp = new byte[1024];while ((size = in.read(temp)) != -1) {out.write(temp, 0, size);
}in.close();return out.toByteArray();
}catch(IOException e) {
e.printStackTrace();return null;
}
}/**
* 根据日期转换为路径 目录到分钟
*
* @return*/
publicString sysDate2path2minute() {
Calendar date=Calendar.getInstance();
String rootDir= "";
String path= rootDir + "/" + date.get(Calendar.YEAR) + "/" + (date.get(Calendar.MONTH) + 1) + "/"
+ date.get(Calendar.DAY_OF_MONTH) + "/" + date.get(Calendar.HOUR_OF_DAY) + "/"
+ date.get(Calendar.MINUTE);returnpath;
}/**
* 根据日期转换为路径 目录到小时
*
* @return*/
publicString sysDate2path2hour() {
Calendar date=Calendar.getInstance();
String rootDir= "";
String path= rootDir + "/" + date.get(Calendar.YEAR) + "/" + (date.get(Calendar.MONTH) + 1) + "/"
+ date.get(Calendar.DAY_OF_MONTH) + "/" + date.get(Calendar.HOUR_OF_DAY);returnpath;
}/**
* 根据日期转换为路径 目录到天
*
* @return*/
publicString sysDate2path2day() {
Calendar date=Calendar.getInstance();
String rootDir= "";
String path= rootDir + "/" + date.get(Calendar.YEAR) + "/" + (date.get(Calendar.MONTH) + 1) + "/"
+ date.get(Calendar.DAY_OF_MONTH);returnpath;
}/**
* * 删除文件 *
*
* @param remoteUpLoadePath
* FTP服务器保存目录 *
* @param remoteFileName
* 要删除的文件名称 *
* @return*/
publicboolean deleteFile(String remoteUpLoadePath, String remoteFileName) {
boolean flag= false;try{//切换FTP目录
this.ftpClient.changeWorkingDirectory(remoteUpLoadePath);//删除
this.ftpClient.dele(remoteFileName);
flag= true;
}catch(Exception e) {
e.printStackTrace();
}finally{if(ftpClient.isConnected()) {try{
ftpClient.disconnect();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnflag;
}public static voidmain(String[] args) throws FileNotFoundException {long start =System.currentTimeMillis();for (int i = 0; i < 100; i++) {
FTPUtil ftp= new FTPUtil("192.168.1.79", 8888, "123", "12345");
ftp.login();
File file= new File("D:\\pic\\" + i % 8 + ".JPG");
InputStreamis = newFileInputStream(file);
ftp.uploadFile(file,"/home/ftp", i + ".jpg");
ftp.logOut();
System.out.println(i + "传输完成!");
}long end =System.currentTimeMillis();
System.out.println("总时间毫秒:" + (end -start));
}
}