ftp上传下载 java FTPClient

   
项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样。没办法,只能自己去写一个。一,    安装sserv-u ftp服务器 版本10.1.0.1 我所设服务器配置:用户名:shiyanming密码:123端口:21跟目录:d:/ftpindex  二、所需jar包:common-net-1.4.1.jarjakarta-oro-2.0.8.jar  注意:第二个jar包必须要存在,不然在列举ftp服务器中文件是出错  三、中文传输问题 四、具体程序   com.ftp. seforgeftputils.java package com.ftp;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.io.outputstream;import java.net.urlencoder;import javax.servlet.http.httpservletresponse;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.ftpfile;import org.apache.commons.net.ftp.ftpreply;/** * @author shiyanming *  */public class seforgeftputils { /**  * 上传程序方法  *   */ public boolean uploadfile(string url, int port, string username,   string password, string path, string filename, inputstream input) {  // filename:要上传的文件  // path :上传的路径  // 初始表示上传失败  boolean success = false;  // 创建ftpclient对象  ftpclient ftp = new ftpclient();  try {   int reply;   // 连接ftp服务器   // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接ftp服务器   ftp.connect(url, port);   // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件   ftp.setcontrolencoding("gbk");   ftpclientconfig conf = new ftpclientconfig(ftpclientconfig.syst_nt);   conf.setserverlanguagecode("zh");   // 登录ftp   ftp.login(username, password);   // 看返回的值是不是230,如果是,表示登陆成功   reply = ftp.getreplycode();   // 以2开头的返回值就会为真   if (!ftpreply.ispositivecompletion(reply)) {    ftp.disconnect();    system.out.println("连接服务器失败");    return success;   }   system.out.println("登陆服务器成功");   ftp.changeworkingdirectory(path);// 转移到ftp服务器目录   ftpfile[] fs = ftp.listfiles(); // 得到目录的相应文件列表   system.out.println(fs.length);   system.out.println(filename);         string filename1 = seforgeftputils.changename(filename, fs);            string filename2 = new string(filename1.getbytes("gbk"),     "iso-8859-1");   string path1 = new string(path.getbytes("gbk"), "iso-8859-1");   // 转到指定上传目录   ftp.changeworkingdirectory(path1);   // 将上传文件存储到指定目录   // ftp.appendfile(new string(filename.getbytes("gbk"),"iso-8859-1"),   // input);   ftp.setfiletype(ftp.binary_file_type); //如果缺省该句 传输txt正常 但图片和其他格式的文件传输出现乱码   ftp.storefile(filename2, input);   // 关闭输入流   input.close();   // 退出ftp   ftp.logout();   // 表示上传成功   success = true;   system.out.println("上传成功。。。。。。");  } catch (ioexception e) {   e.printstacktrace();  } finally {   if (ftp.isconnected()) {    try {     ftp.disconnect();    } catch (ioexception ioe) {    }   }  }  return success; } /**  * 删除程序  *   */ public boolean deletefile(string url, int port, string username,   string password, string path, string filename) {  // filename:要上传的文件  // path :上传的路径  // 初始表示上传失败  boolean success = false;  // 创建ftpclient对象  ftpclient ftp = new ftpclient();  try {   int reply;   // 连接ftp服务器   // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接ftp服务器   ftp.connect(url, port);   // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件   ftp.setcontrolencoding("gbk");   ftpclientconfig conf = new ftpclientconfig(ftpclientconfig.syst_nt);   conf.setserverlanguagecode("zh");   // 登录ftp   ftp.login(username, password);   // 看返回的值是不是230,如果是,表示登陆成功   reply = ftp.getreplycode();   // 以2开头的返回值就会为真   if (!ftpreply.ispositivecompletion(reply)) {    ftp.disconnect();    system.out.println("连接服务器失败");    return success;   }   system.out.println("登陆服务器成功");   string filename2 = new string(filename.getbytes("gbk"),     "iso-8859-1");   string path1 = new string(path.getbytes("gbk"), "iso-8859-1");   // 转到指定上传目录   ftp.changeworkingdirectory(path1);   ftpfile[] fs = ftp.listfiles(); // 得到目录的相应文件列表   ftp.deletefile(filename2);   ftp.logout();   success=true;  } catch (ioexception e) {system.out.println(e);      } finally {   if (ftp.isconnected()) {    try {     ftp.disconnect();    } catch (ioexception ioe) {    }   }  }  return success; }  /**  * 下载程序  *   */ public static boolean downfile(string ip, int port, string username,   string password, string remotepath, string filename,   outputstream outputstream, httpservletresponse response) {  boolean success = false;  ftpclient ftp = new ftpclient();  try {   int reply;   ftp.connect(ip, port);   // 下面三行代码必须要,而且不能改变编码格式   ftp.setcontrolencoding("gbk");   ftpclientconfig conf = new ftpclientconfig(ftpclientconfig.syst_nt);   conf.setserverlanguagecode("zh");   // 如果采用默认端口,可以使用ftp.connect(url) 的方式直接连接ftp服务器   ftp.login(username, password);// 登录   ftp.setfiletype(ftpclient.binary_file_type);   reply = ftp.getreplycode();   if (!ftpreply.ispositivecompletion(reply)) {    ftp.disconnect();    return success;   }   system.out.println("登陆成功。。。。");   ftp.changeworkingdirectory(remotepath);// 转移到ftp服务器目录   ftpfile[] fs = ftp.listfiles(); // 得到目录的相应文件列表   // system.out.println(fs.length);//打印列表长度   for (int i = 0; i < fs.length; i++) {    ftpfile ff = fs[i];    if (ff.getname().equals(filename)) {     string filename = filename;     // 这个就就是弹出下载对话框的关键代码     response.setheader("content-disposition",       "attachment;filename="         + urlencoder.encode(filename, "utf-8"));     // 将文件保存到输出流outputstream中     ftp.retrievefile(new string(ff.getname().getbytes("gbk"),       "iso-8859-1"), outputstream);     outputstream.flush();     outputstream.close();    }   }   ftp.logout();   success = true;  } catch (ioexception e) {   e.printstacktrace();  } finally {   if (ftp.isconnected()) {    try {     ftp.disconnect();    } catch (ioexception ioe) {    }   }  }  return success; } // 判断是否有重名方法 public static boolean isdirexist(string filename, ftpfile[] fs) {  for (int i = 0; i < fs.length; i++) {   ftpfile ff = fs[i];   if (ff.getname().equals(filename)) {    return true; // 如果存在返回 正确信号   }  }  return false; // 如果不存在返回错误信号 } // 根据重名判断的结果 生成新的文件的名称 public static string changename(string filename, ftpfile[] fs){  int n = 0;  // 创建一个可变的字符串对象 即stringbuffer对象,把filename值付给该对象  stringbuffer filename1 = new stringbuffer("");  filename1 = filename1.append(filename);  system.out.println(filename1);  while (isdirexist(filename1.tostring(), fs)) {   n++;   string a = "[" + n + "]";   system.out.println("字符串a的值是:" + a);   int b = filename1.lastindexof(".");// 最后一出现小数点的位置   int c = filename1.lastindexof("[");// 最后一次"["出现的位置   if (c < 0) {    c = b;   }   stringbuffer name = new stringbuffer(filename1.substring(0, c));// 文件的名字   stringbuffer suffix = new stringbuffer(filename1.substring(b + 1));// 后缀的名称   filename1 = name.append(a).append(".").append(suffix);  }  return filename1.tostring(); } /**  * @param args  * @throws filenotfoundexception  *             测试程序  */ public static void main(string[] args) throws filenotfoundexception {  string path = "";  file f1 = new file("c:\\新.txt");  string filename = f1.getname();  system.out.println(filename);  //inputstream input = new fileinputstream(f1);  //seforgeftputils a = new seforgeftputils();  //a.uploadfile("172.25.5.193", 21, "shiyanming", "123", path, filename, input);  /*   * string path ="d:\\ftpindex\\"; file f2 = new   * file("d:\\ftpindex\\old.txt"); string filename2= f2.getname();   * system.out.println(filename2); seforgeftputils a = new   * seforgeftputils(); a.downfile("172.25.5.193", 21, "shi", "123", path,   * filename2, "c:\\");   */    seforgeftputils a = new seforgeftputils();  a.deletefile("192.168.0.100", 21, "shiyanming", "123", path, filename); }}上边程序完成了文件的上传和下载重命名判断问题,如果重名,在后边加(n)。存在问题:如果jsp页面中读取from表单的值,只能获取主机的地址,不能上传客户端文件。      3.1、 默认情况下,ftpclient使用的是utf_8字符集作为服务器通讯的编码集。而ftp服务器serv-u在windowsxp上,使用gbk字符集作为服务器通讯。   // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件    ftp.setcontrolencoding("gbk");    ftpclientconfig conf = new ftpclientconfig(ftpclientconfig.syst_nt);conf.setserverlanguagecode("zh"); 3.2、同时还要设置服务器设置步骤:      1、打开serv-u 8.0控制台,点击“限制和设置”--“为域配置高级ftp命令设置和行为”。      2、在ftp设置中找到opts utf8命令,右击禁用此命令。3、点击下面的“全局属性”。      4、在出来的ftp命令属性选项卡中,“高级选项”里,把“对所有收发的路径和文件名使用uft-8编码”前面的钩去掉!      5、以后再上传中文文件,就不会出现乱码问题啦。
 

你可能感兴趣的:(java,工作)