`

java编写的FTP上传简单工具类

阅读更多
package com.icelove.util;

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 icelove
 *
 */
public class FtpUtil {
 private String ip = "";
 private String username = "";
 private String password = "";
 private int port = -1;
 private String path = "";
 private FtpClient ftpClient = null;
 private OutputStream os = null;
 private 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");
  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.uploadFile(sourceFile[i].getPath(), sourceFile[i].getName());
    }
   }
  } else {
   uploadFile(file_in.getPath(), newName);
  }
  ftpClient.cd(path);
 }

 /**    
  *  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    
  */
 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;
 }

 public static void main(String[] args) {
  FtpUtil ftp = new FtpUtil("133.224.202.2", "tstbill", "tstbill");
  ftp.connectServer();
  boolean result = ftp.upload("C:/test_why", "test_why/test");
  System.out.println(result ? "上传成功!" : "上传失败!");
  List list = ftp.getFileList("test_why/test");
  for (int i = 0; i < list.size(); i++) {
   String name = list.get(i).toString();
   System.out.println(name);
  }
  ftp.closeServer();
  /**    
  FTP远程命令列表    
  USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT    
  PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS    
  ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH    
  REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ    
  QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT    
  在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n    
  ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令    
  ftpclient.readServerResponse一定要在sendServer后调用    
  nameList("/test")获取指目录下的文件列表    
  XMKD建立目录,当目录存在的情况下再次创建目录时报错    
  XRMD删除目录    
  DELE删除文件    
   */
 }
}
分享到:
评论

相关推荐

    java编写的ftp文件实时监控下载上传

    用java语言编写的ftp小工具,可以按指定时间监控ftp服务器,把服务器指定目录内新产生的文件或者文件夹下载到本地指定文件夹,下载后删除数据。 也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到...

    java FTP 包含linux与windows

    自写编写的通用java ftp 工具类,包含用的到jar与源代码,windows和linux都可以使用。

    Java源码包100个设计实例.zip

    ftp简易服务器.rar HAHA CHAT Java仿QQ聊天程序源代码.rar html 标记大全.rar iCHAT聊天室基于Java.rar IP定位器.rar J2ME优化压缩PNG文件.rar J2ME冒险游戏CASPER源代码.rar J2me月光战机游戏源码.rar J2ME黑白棋...

    java源码包---java 源码 大量 实例

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    JAVA上百实例源码以及开源项目

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    JAVA上百实例源码以及开源项目源代码

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    伊伊FTP定时触发器(EyiFtpTimer)

    伊伊FTP当时触发器,这是我上周刚刚弄完的一个小工具,她的主要功能,是通过FTP对文件进行上传和下载功能,她有两种计时方式,第一种到指定时间进行上传和下载操作,如指定到2009年10月1日12点12分执行,另一种计时...

    java源码包4

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    java开源包11

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包6

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包9

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包4

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java源码包3

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    java开源包101

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包5

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包8

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包10

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java源码包2

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    java开源包1

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

    java开源包3

    SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...

Global site tag (gtag.js) - Google Analytics