设为首页 收藏本站
查看: 599|回复: 0

ftp上传下载 java FTPClient

[复制链接]

尚未签到

发表于 2015-5-28 13:33:34 | 显示全部楼层 |阅读模式
  项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样。没办法,只能自己去写一个。   
  
一,    安装sserv-u ftp服务器 版本10.1.0.1   
  
我所设服务器配置:   
  
用户名:shiyanming   
  
密码:123  
  
端口:21  
  
跟目录:D:/ftpindex   
  
   
  
   
  
二、所需jar包:common-net-1.4.1.jar   
  
jakarta-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;   
  
    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;   
  
   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、以后再上传中文文件,就不会出现乱码问题啦。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-71555-1-1.html 上篇帖子: 关于solaris下修改ftp服务端口 下篇帖子: C#遍历FTP文件夹/下载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表