@version 1.0
*/
public class FtpUtil {
private String ip="";
private String username="";
private String password="";
private int port=-1;
private String path="";
FtpClient ftpClient=null;
OutputStream os=null;
FileInputStream is=null;
public FtpUtil(String serverIp ,String username,String password){
this.ip=serverIp;
this.username=username;
this.password=password;
}
public FtpUtil(String serverIp , int port,String username,String password){
this.ip=serverIp;
this.port=port;
this.username=username;
this.password=password;
}
public static void main(String args[]){
FtpUtil ftp=new FtpUtil("172.16.10.142","admin","adminly");
ftp.connectServer();
boolean result=ftp.upload("C:/Documents and Settings/SJKC/桌面/java/cc.txt", "cc.txt");
// boolean result=ftp.downloadFile("C:/Documents and Settings/SJKC/桌面/java/cc.txt", "cc.txt");
System.out.println(result ? "上传成功!" : "上传失败!");
ftp.closeServer();
}
/**
- ftp上传 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
- @param fileName 要上传的文件(或文件夹)名
- @param newName 服务器端要生成的文件(或文件夹)名
- @return */ public boolean upload(String fileName,String newName){ try{ String savefilename=new String(fileName.getBytes("GBK"),"GBK"); File file_in = new File(savefilename);// 打开本地待长传的文件 if (!file_in.exists()) { throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!"); } if (file_in.isDirectory()) { upload(file_in.getPath(), newName, ftpClient.pwd()); } else { uploadFile(file_in.getPath(), newName); } if (is != null) { is.close(); } if (os != null) { os.close(); } return true; } catch (Exception e) { e.printStackTrace(); System.err.println("Exception e in Ftp upload(): " + e.toString()); return false; } finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } }
/**
- 真正用于上传的方法
- @param fileName
- @param newName
- @param path */ private void upload(String fileName, String newName, String path) throws Exception{ String savefilename=new String(fileName.getBytes("ISO-8859-1"),"GBK"); File file_in=new File(savefilename);//打开本地待上传的文件 if(!file_in.exists()){ throw new Exception("此文件或文件夹["+file_in.getName()+"]有误或不存在!"); } if(file_in.isDirectory()){ if(!isDirExist(newName)){ createDir(newName); } ftpClient.cd(newName); File sourceFile[]=file_in.listFiles(); for(int i=0;i<sourceFile.length;i++){ if(!sourceFile[i].exists()){ continue; } if(sourceFile[i].isDirectory()){ this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName); }else{ this.upload(sourceFile[i].getPath(),sourceFile[i].getName()); } } }else{ uploadFile(file_in.getPath(),newName); } ftpClient.cd(path); }
/**
- 在当前目录下创建文件夹
- @param dir
@return
/
private boolean createDir(String dir){
try{
ftpClient.ascii();//转换到字符模式下
StringTokenizer s=new StringTokenizer(dir,"/");//sign(记号,符号)
s.countTokens();
/*
* countTokens
public int countTokens()计算在生成异常之前可以调用此 tokenizer 的 nextToken 方法的次数。当前位置没有提前。
返回:
使用当前分隔符集的字符串中剩余的标记数。
以上是API中的说明,
我写了一个小程序:
import java.util.*;
public class Tokenizer{
public static void main(String[] args){
StringTokenizer a = new StringTokenizer("a b c");
System.out.println(a.countTokens());
}
}
程序执行的结果是3,因为a b c采用默认的分隔符分隔,一共有a,b,c三个token,所以countTokens()的结果是3
*/
String pathName=ftpClient.pwd();
while(s.hasMoreElements()){
pathName=pathName+"/"+(String)s.nextElement();
try{
ftpClient.sendServer("MKD "+pathName+"\r\n");
}catch(Exception e){
e=null;
return false;
}
ftpClient.readServerResponse();
}
ftpClient.binary();
return true;
}catch(IOException ee){
ee.printStackTrace();
return false;
}
}
/**
- 连接ftp服务器
- @return */ public boolean connectServer(){ ftpClient=new FtpClient(); try{ if(this.port!=-1){ ftpClient.openServer(this.ip,this.port); }else{ ftpClient.openServer(this.ip); } ftpClient.login(this.username, this.password); if(this.path.length()!=0){ ftpClient.cd(this.path);//path是ftp服务下主目录的子目录 } ftpClient.binary();//使用二进制上传与下载 System.out.println("已登录到\""+ftpClient.pwd()+"\"目录"); return true; }catch(IOException e){ e.printStackTrace(); return false; } }
/**
- 断开与ftp服务器的连接
- @return */ public boolean closeServer(){ try{ if(is!=null){ is.close(); } if(os!=null){ os.close(); } if(ftpClient!=null){ ftpClient.closeServer(); } System.out.println("已与服务器断开连接"); return true; }catch(IOException e){ e.printStackTrace(); return false; } }
/**
- 检查文件在当前目录下是否存在
- @param dir
- @return */ private boolean isDirExist(String dir){ String pwd=""; try{ pwd=ftpClient.pwd(); ftpClient.cd(dir); ftpClient.cd(pwd); }catch(Exception e){ e.printStackTrace(); return false; } return true; }
/**
- ftp上传 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
- @param filename 要上传的文件(或文件夹)名
- @return */ public boolean upload(String filename){ String newname=""; if(filename.indexOf("/")>-1){ newname=filename.substring(filename.lastIndexOf("/")+1); }else{ newname=filename; } return upload(filename,newname); }
/**
- upload 上传文件
- @param filename 要上传的文件名
- @param newname 上传后的新文件名
- @return -1 文件不存在 >=0 成功上传,返回文件的大小
- @throws Exception */ public long uploadFile(String filename, String newname) throws Exception { long result = 0; TelnetOutputStream os = null; FileInputStream is = null; try { java.io.File file_in = new java.io.File(filename); if (!file_in.exists())
return -1; os = ftpClient.put(newname); result = file_in.length(); is = new FileInputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } } finally { if (is != null) { is.close(); } if (os != null) { os.close(); } } return result; }
/**
- 从ftp下载文件到本地
- @param filename 服务器上的文件名
- @param newfilename 本地生成的文件名
- @return
- @throws Exception */ public long downloadFile(String filename, String newfilename) { long result = 0; TelnetInputStream is = null; FileOutputStream os = null; try { is = ftpClient.get(filename); java.io.File outfile = new java.io.File(newfilename); os = new FileOutputStream(outfile); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); result = result + c; } } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } return result; }
/**
- 取得相对于当前连接目录的某个目录下所有文件列表
- @param path
- @return */ @SuppressWarnings({ "unchecked", "deprecation" }) public List getFileList(String path){ List list = new ArrayList(); DataInputStream dis; try { dis = new DataInputStream(ftpClient.nameList(this.path + path)); String filename = ""; while ((filename = dis.readLine()) != null) { list.add(filename); } } catch (IOException e) { e.printStackTrace(); } return list; }