packageftp;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.MalformedURLException;importorg.apache.commons.net.ftp.FTP;importorg.apache.commons.net.ftp.FTPClient;importorg.apache.commons.net.ftp.FTPFile;importorg.apache.commons.net.ftp.FTPReply;public classFtpUtils {//ftp服务器地址
public String hostname = "10.0.46.138";//ftp服务器端口号默认为21
public Integer port = 21;//ftp登录账号
public String username = "ftptest";//ftp登录密码
public String password = "ftptest";public FTPClient ftpClient = null;/*** 初始化ftp服务器*/
public voidinitFtpClient() {
ftpClient= newFTPClient();
ftpClient.setControlEncoding("utf-8");try{
System.out.println("connecting...ftp服务器:" + this.hostname + ":" + this.port);
ftpClient.connect(hostname, port);//连接ftp服务器
ftpClient.login(username, password); //登录ftp服务器
int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
if (!FTPReply.isPositiveCompletion(replyCode)) {
System.out.println("connect failed...ftp服务器:" + this.hostname + ":" + this.port);
}else{
System.out.println("connect successfu...ftp服务器:" + this.hostname + ":" + this.port);
}
}catch(MalformedURLException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}/*** 上传文件
*
*@parampathname
* ftp服务保存地址
*@paramfileName
* 上传到ftp的文件名
*@paramoriginfilename
* 待上传文件的名称(绝对地址) *
*@return
*/
public booleanuploadFile(String pathname, String fileName, String originfilename) {
InputStream inputStream= null;try{
System.out.println("开始上传文件");
inputStream= new FileInputStream(newFile(originfilename));
initFtpClient();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.setControlEncoding("UTF-8");//每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据
ftpClient.enterLocalPassiveMode();//观察是否真的上传成功
boolean storeFlag =ftpClient.storeFile(fileName, inputStream);
System.err.println("storeFlag==" +storeFlag);
inputStream.close();
ftpClient.logout();
System.out.println("上传文件成功");
}catch(Exception e) {
System.out.println("上传文件失败");
e.printStackTrace();
}finally{if(ftpClient.isConnected()) {try{
ftpClient.disconnect();
}catch(IOException e) {
e.printStackTrace();
}
}if (null !=inputStream) {try{
inputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}return true;
}/*** 上传文件
*
*@parampathname
* ftp服务保存地址
*@paramfileName
* 上传到ftp的文件名
*@paraminputStream
* 输入文件流
*@return
*/
public booleanuploadFile(String pathname, String fileName, InputStream inputStream) {try{
System.out.println("开始上传文件");
initFtpClient();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
CreateDirecroty(pathname);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
System.out.println("上传文件成功");
}catch(Exception e) {
System.out.println("上传文件失败");
e.printStackTrace();
}finally{if(ftpClient.isConnected()) {try{
ftpClient.disconnect();
}catch(IOException e) {
e.printStackTrace();
}
}if (null !=inputStream) {try{
inputStream.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}return true;
}//改变目录路径
public booleanchangeWorkingDirectory(String directory) {boolean flag = true;try{
flag=ftpClient.changeWorkingDirectory(directory);if(flag) {
System.out.println("进入文件夹" + directory + " 成功!");
}else{
System.out.println("进入文件夹" + directory + " 失败!开始创建文件夹");
}
}catch(IOException ioe) {
ioe.printStackTrace();
}returnflag;
}//创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
public boolean CreateDirecroty(String remote) throwsIOException {boolean success = true;
String directory= remote + "/";//如果远程目录不存在,则递归创建远程服务器目录
if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(newString(directory))) {int start = 0;int end = 0;if (directory.startsWith("/")) {
start= 1;
}else{
start= 0;
}
end= directory.indexOf("/", start);
String path= "";
String paths= "";while (true) {
String subDirectory= new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");
path= path + "/" +subDirectory;if (!existFile(path)) {if(makeDirectory(subDirectory)) {
changeWorkingDirectory(subDirectory);
}else{
System.out.println("创建目录[" + subDirectory + "]失败");
changeWorkingDirectory(subDirectory);
}
}else{
changeWorkingDirectory(subDirectory);
}
paths= paths + "/" +subDirectory;
start= end + 1;
end= directory.indexOf("/", start);//检查所有目录是否创建完毕
if (end <=start) {break;
}
}
}returnsuccess;
}//判断ftp服务器文件是否存在
public boolean existFile(String path) throwsIOException {boolean flag = false;
FTPFile[] ftpFileArr=ftpClient.listFiles(path);if (ftpFileArr.length > 0) {
flag= true;
}returnflag;
}//创建目录
public booleanmakeDirectory(String dir) {boolean flag = true;try{
flag=ftpClient.makeDirectory(dir);if(flag) {
System.out.println("创建文件夹" + dir + " 成功!");
}else{
System.out.println("创建文件夹" + dir + " 失败!");
}
}catch(Exception e) {
e.printStackTrace();
}returnflag;
}/*** * 下载文件 *
*
*@parampathname
* FTP服务器文件目录 *
*@paramfilename
* 文件名称 *
*@paramlocalpath
* 下载后的文件路径 *
*@return
*/
public booleandownloadFile(String pathname, String filename, String localpath) {boolean flag = false;
OutputStream os= null;try{
System.out.println("开始下载文件");
initFtpClient();//切换FTP目录
boolean changeFlag =ftpClient.changeWorkingDirectory(pathname);
System.err.println("changeFlag==" +changeFlag);
ftpClient.enterLocalPassiveMode();
ftpClient.setRemoteVerificationEnabled(false);//查看有哪些文件夹 以确定切换的ftp路径正确
String[] a =ftpClient.listNames();
System.err.println(a[0]);
FTPFile[] ftpFiles=ftpClient.listFiles();for(FTPFile file : ftpFiles) {if(filename.equalsIgnoreCase(file.getName())) {
File localFile= new File(localpath + "/" +file.getName());
os= newFileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag= true;
System.out.println("下载文件成功");
}catch(Exception e) {
System.out.println("下载文件失败");
e.printStackTrace();
}finally{if(ftpClient.isConnected()) {try{
ftpClient.disconnect();
}catch(IOException e) {
e.printStackTrace();
}
}if (null !=os) {try{
os.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnflag;
}/*** * 删除文件 *
*
*@parampathname
* FTP服务器保存目录 *
*@paramfilename
* 要删除的文件名称 *
*@return
*/
public booleandeleteFile(String pathname, String filename) {boolean flag = false;try{
System.out.println("开始删除文件");
initFtpClient();//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag= true;
System.out.println("删除文件成功");
}catch(Exception e) {
System.out.println("删除文件失败");
e.printStackTrace();
}finally{if(ftpClient.isConnected()) {try{
ftpClient.disconnect();
}catch(IOException e) {
e.printStackTrace();
}
}
}returnflag;
}public static voidmain(String[] args) {
FtpUtils ftp= newFtpUtils();//文件路径写为用户建立时 指定的目录//ftp.uploadFile("/home/ftptest/var/ftp/pub/test", "adt-bundle-windows-x86_64-20140702.rar", "E://chart/adt-bundle-windows-x86_64-20140702.rar");//ftp.downloadFile("/home/ftptest/var/ftp/pub/test", "hongmenci.png", "E://");
ftp.deleteFile("/home/ftptest/var/ftp/pub/test", "adt-bundle-windows-x86_64-20140702.rar");//System.out.println("ok");
}
}