FTP客户端(利用sun.net.ftp.FtpClient实现)
sun.net.ftp.FtpClient是jdk1.6的org.apache.commons.net.ftp.FTPClient是jdk1.7的使用时要注意
昨天帮同事弄java上传文件到ftp服务器,用的sun.net.ftp.FtpClient,感觉很简单,也很好用,写了个小例子,留作备份。
这个小例子实现了文件(或文件夹)上传,文件下载,取得某目录下文件列表等功能,对于文件夹下载还没有实现,改天有空改完了再贴上来吧。由于通过设定好的用户名、密码登陆到ftp server时,连接到的目录不一定是根目录,有可能是根目录下很深层的一个子目录,比如“usr/why/test/ftp/upload/exercise/20090730”,所以我觉得针对当前连接目录进行操作,要比每次都从根目录开始指定方便。
- package com.why.ftp;
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.StringTokenizer;
- import sun.net.TelnetInputStream;
- import sun.net.TelnetOutputStream;
- import sun.net.ftp.FtpClient;
- /**
- * ftp上传,下载
- * @author why 2009-07-30
- *
- */
- 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.username = username;
- this.password = password;
- this.port = port;
- }
- /**
- * 连接ftp服务器
- *
- * @throws IOException
- */
- 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();// 用2进制上传、下载
- System.out.println("已登录到\"" + ftpClient.pwd() + "\"目录");
- return true;
- }catch (IOException e){
- e.printStackTrace();
- return false;
- }
- }
- /**
- * 断开与ftp服务器连接
- *
- * @throws IOException
- */
- 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){
- return false;
- }
- return true;
- }
- /**
- * 在当前目录下创建文件夹
- * @param dir
- * @return
- * @throws Exception
- */
- private boolean createDir(String dir){
- try{
- ftpClient.ascii();
- StringTokenizer s = new StringTokenizer(dir, "/"); //sign
- s.countTokens();
- 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 e1){
- e1.printStackTrace();
- return false;
- }
- }
- /**
- * ftp上传
- * 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
- *
- * @param filename 要上传的文件(或文件夹)名
- * @return
- * @throws Exception
- */
- public boolean upload(String filename){
- String newname = "";
- if(filename.indexOf("/") > -1){
- newname = filename.substring(filename.lastIndexOf("/") + 1);
- }else{
- newname = filename;
- }
- return upload(filename, newname);
- }
- /**
- * ftp上传
- * 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
- *
- * @param fileName 要上传的文件(或文件夹)名
- * @param newName 服务器段要生成的文件(或文件夹)名
- * @return
- */
- public boolean upload(String fileName, String newName){
- try{
- 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()){
- 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
- * @throws Exception
- */
- private void upload(String fileName, String newName,String path) throws Exception{
- String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");