import java.io.BufferedInputStream;
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.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPReply;
import sun.net.TelnetInputStream;
import sun.net.ftp.FtpClient;
public class Ftp {
FtpClient ftpClient = null;
private static Log logger;
private static String UserName = null;
private static String Password = null;
private static String Ip = null;
private static Integer Port = null;
private static Properties Property = null;
private FTPClient FtpClientTEMP = null;
private static SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd hh:mm");
public static final int BINARY_FILE_TYPE = FTP.BINARY_FILE_TYPE;
public static final int ASCII_FILE_TYPE = FTP.ASCII_FILE_TYPE;
public static int i=1;
public static Boolean connect_flag = false;
public boolean loadFile(Ftp ftp , String[] remoteFileName, String[] localFileName,InputStream is) {
boolean flag = true;
// InputStream is = null;
FileOutputStream os = null;
long result = 0;
try {
FtpClient client = connectServerClient(ftp,is);
for(int i = 0; i < remoteFileName.length; i++){
os = new FileOutputStream(localFileName[i]);
is = client.get(remoteFileName[i]);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
result = result + c;
}
}
} catch (Exception e) {
e.printStackTrace();
logger.debug("本地文件下载失败!", e);
} finally {
try {
is.close();
os.close();
closeConnect(ftp);
} catch (IOException e) {
e.printStackTrace();
}
}
return flag;
}
public boolean uploadFile(Ftp ftp,InputStream is,File[] docNew, String[] newFileName) {
boolean flag = true;
try {
connect_flag = connectServer(ftp,is);
//设置的三步骤
ftp.getFtpClientTEMP().setFileType(BINARY_FILE_TYPE);
ftp.getFtpClientTEMP().enterLocalPassiveMode();
ftp.getFtpClientTEMP().setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
InputStream input = null;
for(int i = 0; i < docNew.length; i++){
File file = docNew[i];
File newFile = new File(newFileName[i]);
String dir = newFile.getParentFile().getPath();
if (!ftp.getFtpClientTEMP().changeWorkingDirectory(dir)) {// 如果不能进入dir下,说明此目录不存在!
if (!makeDirectory(ftp,is,newFile.getParentFile().getPath())) {
System.out.println("创建文件目录【"+dir+"】失败!");
}
}
changeWorkingDirectory(ftp,"/");// 回到FTP根目录
input = new FileInputStream(file);
if (input == null) {
System.out.println("本地文件不存在");
logger.debug("本地文件不存在,请重新选择!");
}
if (newFileName[i].trim().equals("")) {
newFileName[i] = file.getName();
}
flag = ftp.getFtpClientTEMP().storeFile(newFileName[i], input);
if (flag) {
System.out.println("upload File succeed");
} else {
System.out.println("upload File false");
}
}
input.close();
} catch (IOException e) {
e.printStackTrace();
logger.debug("本地文件上传失败!", e);
// TODO: handle exception
} catch (Exception e) {
e.printStackTrace();
// logger.debug("本地文件上传失败!", e);
// TODO: handle exception
}finally{
closeConnect(ftp);
}
return flag;
}
public void closeConnect(Ftp ftp) {
FtpClientTEMP = ftp.getFtpClientTEMP();
ftpClient = ftp.getFtpClient();
try {
if(FtpClientTEMP != null){
FtpClientTEMP.logout();
FtpClientTEMP.disconnect();
FtpClientTEMP = null;
}
if(ftpClient != null){
ftpClient.closeServer();
ftpClient = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setFileType(int fileType) {
try {
// connectServer();
FtpClientTEMP.setFileType(fileType);
} catch (Exception e) {
e.printStackTrace();
}
}
protected FTPClient getFtpClient(Ftp ftp,InputStream is) {
connectServer(ftp,is);
return FtpClientTEMP;
}
private static void setArg(InputStream is) {
Property = new Properties();
BufferedInputStream inBuff = null;
try {
// File file = new File(configFile);
inBuff = new BufferedInputStream(is);
Property.load(inBuff);
UserName = Property.getProperty("username");
Password = Property.getProperty("password");
Ip = Property.getProperty("ip");
Port = Integer.parseInt(Property.getProperty("port"));
} catch (FileNotFoundException e1) {
System.out.println("FTP配置文件不存在!");
e1.printStackTrace();
} catch (IOException e) {
System.out.println("FTP配置文件无法读取!");
e.printStackTrace();
}
}
public boolean connectServer(Ftp ftp,InputStream is) {
FtpClientTEMP = ftp.getFtpClientTEMP();
boolean flag = true;
if (FtpClientTEMP == null) {
int reply;
try {
setArg(is);
FtpClientTEMP = new FTPClient();
FtpClientTEMP.setControlEncoding("GBK");
FtpClientTEMP.setDefaultPort(Port);
FtpClientTEMP.configure(getFtpConfig());
FtpClientTEMP.connect(Ip);
FtpClientTEMP.login(UserName, Password);
FtpClientTEMP.setDefaultPort(Port);
//System.out.print(FtpClient.getReplyString());
reply = FtpClientTEMP.getReplyCode();
FtpClientTEMP.setDataTimeout(120000);
if (!FTPReply.isPositiveCompletion(reply)) {
FtpClientTEMP.disconnect();
System.err.println("FTP server refused connection.");
// logger.debug("FTP 服务拒绝连接!");
flag = false;
}
// System.out.println(i);
// i ;
} catch (SocketException e) {
flag = false;
e.printStackTrace();
System.err.println("登录ftp服务器【" +Ip+ "】失败,连接超时!");
// logger.debug("登录ftp服务器【" Ip "】失败");
} catch (IOException e) {
flag = false;
e.printStackTrace();
System.err.println("登录ftp服务器【"+ Ip +"】失败,FTP服务器无法打开!");
// logger.debug("登录ftp服务器【" Ip "】失败");
}
}
return flag;
}
public static void changeWorkingDirectory(Ftp ftp , String directory) {
try {
ftp.getFtpClientTEMP().changeWorkingDirectory(directory);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public void renameFile(Ftp ftp,InputStream is,String oldFileName, String newFileName) {
try {
connectServer(ftp,is);
FtpClientTEMP.rename(oldFileName, newFileName);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
private static FTPClientConfig getFtpConfig() {
FTPClientConfig ftpConfig = new FTPClientConfig(
FTPClientConfig.SYST_UNIX);
ftpConfig.setServerLanguageCode(FTP.DEFAULT_CONTROL_ENCODING);
return ftpConfig;
}
private static String iso8859togbk(Object obj) {
try {
if (obj == null)
return "";
else
return new String(obj.toString().getBytes("iso-8859-1"), "GBK");
} catch (Exception e) {
return "";
}
}
public boolean makeDirectory(Ftp ftp,InputStream is,String dir) throws IOException {
boolean flag = true;
FtpClientTEMP = ftp.getFtpClientTEMP();
if(FtpClientTEMP == null){
connectServer(ftp,is);
}
flag = FtpClientTEMP.makeDirectory(dir);
if (!flag) {
System.out.println("make Directory " +dir+ " false");
}
return flag;
}
public static Log getLogger() {
return logger;
}
public static void setLogger(Log logger) {
Ftp.logger = logger;
}
public FtpClient connectServerClient(Ftp ftp,InputStream is){
ftpClient = new FtpClient();
setArg(is);
try {
if(Port != -1){
ftpClient.openServer(Ip,Port);
}else{
ftpClient.openServer(Ip);
}
ftpClient.login(UserName, Password);
ftpClient.binary();// 用2进制上传、下载
System.out.println("已登录到\"" + ftpClient.pwd() + "\"目录");
return ftpClient;
}catch (IOException e){
e.printStackTrace();
return null;
}
}
public FTPClient getFtpClientTEMP() {
return FtpClientTEMP;
}
public void setFtpClientTEMP(FTPClient ftpClientTEMP) {
FtpClientTEMP = ftpClientTEMP;
}
public void setFtpClient(FtpClient ftpClient) {
this.ftpClient = ftpClient;
}
public FtpClient getFtpClient() {
return ftpClient;
}
}