`

ftp上传下载 java FTPClient

阅读更多
项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样。没办法,只能自己去写一个。

一,    安装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[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、以后再上传中文文件,就不会出现乱码问题啦。
分享到:
评论
2 楼 chenpi529 2011-11-09  
1 楼 a198720 2011-10-15  
写的太好了!整好让我解决了上传乱码问题。

相关推荐

    调用FtpClient类上传文件(java)

    Apache Commons Net提供了丰富的FTP操作接口,使得开发者能够方便地执行包括上传、下载、删除等在内的各种FTP操作。 首先,我们需要确保项目中包含了正确的依赖库。在描述中提到了几个jar文件,但`FtpClient`是属于...

    java利用FTPClient实现上传下载文件.doc

    Java 中使用 FTPClient 实现上传下载文件是 Java 程序中经常需要和 FTP 打交道的重要内容。FTPClient 是 Jakarta Commons 中的一个工具类,位于 Commons Net 包中。FTPClient 提供了上传、下载、删除、创建目录等...

    javaftp.rar_FTP界面_edtftpj.jar downlo_ftp 上传下载_java ftpClient fo

    4. **FTP上传下载**:FTP客户端的核心功能之一就是文件的上传和下载。上传是将本地文件发送到FTP服务器的过程,而下载则是从服务器获取文件到本地。这些操作通过FTPClient库的API实现,例如`storeFile()`用于上传,`...

    java FTPClient 文件上传下载文件

    ### Java FTPClient 文件上传下载知识点详解 #### 一、引言 在现代软件开发中,文件传输是一项基本而重要的功能。对于Java开发者来说,利用Java的FTPClient进行文件的上传和下载是常见的需求之一。本篇文章将围绕...

    FTP.rar_ftp swing_java FtpClient_java ftp_swing_swing 开发ftp

    标签进一步强调了关键的技术点:“ftp__swing”表明这是用Swing构建的FTP客户端,“java_ftpclient”表示使用了Java的FTP客户端库,“java_ftp”和“swing_开发ftp”则分别强调了Java语言在FTP应用中的使用以及Swing...

    java ftp 下载 源程序 FTPClient

    Java FTP下载源程序是用于通过FTP(File Transfer Protocol,文件传输协议)在Java应用程序中实现文件上传和下载功能的关键技术。FTPClient是一个流行的Java库,它提供了与FTP服务器交互的接口,使得开发者能够轻松...

    ftp上传下载java代码

    总结,使用Java实现FTP上传下载主要依赖于Apache Commons Net库,通过创建FTPClient对象,连接服务器,设置传输模式,然后执行上传或下载操作。在实际应用中,还需要考虑异常处理、性能优化等问题,以实现更高效、...

    java大文件上传至ftp服务器带进度条显示的

    这个场景中,我们关注的重点是如何在上传过程中显示进度条,并确保该进度条与FTP上传的速度同步,以提供用户友好的交互体验。 在Java中,我们可以使用`java.net`或`org.apache.commons.net`库来实现FTP文件上传。...

    javaftp.rar_FTPClient java_ftpclient_javaftp client_swing上传下载_上传

    总的来说,“javaftp.rar”项目是一个用Java Swing和FTPClient实现的FTP客户端应用,提供了基本的文件和文件夹管理功能。对于学习FTP客户端开发的初学者来说,这是一个很好的实践案例,可以帮助理解如何将GUI与网络...

    JAVA中使用FTPClient上传下载

    通过使用Java中的FTPClient库,开发人员可以轻松地在应用程序中集成FTP功能,实现文件的远程上传和下载。本文详细介绍了如何使用FTPClient进行这些操作,包括连接、登录、上传文件和断开连接的步骤。这为开发需要与...

    Java实现FTP文件上传和下载

    在Java编程语言中,FTP(File Transfer Protocol)文件上传和下载是常见的网络操作,用于在本地计算机和远程服务器之间交换文件。以下将详细介绍如何使用Java实现FTP文件上传和下载的步骤,以及涉及到的关键知识点。...

    java 连接 FTP 文件操作(上传,下载,删除,复制

    本文将详细讨论如何使用Java连接FTP(File Transfer Protocol)服务器,进行文件的上传、下载、删除以及复制等操作。 首先,Java通过`java.net`和`javax.net`包提供了FTP客户端的功能。主要依赖于`java.net....

    自己收集的多个Java FTP断点续传的例子源码

    ftp上传下载 java FTPClient - - ITeye技术网站 (2012年5月21日) FTP操作类:FTPClient - 石川 - 博客园 (2012年5月21日) JAVA中使用FTPClient上传下载 - hbcui1984的专栏 - 博客频道 - CSDN.NET (2012年5月21日) ...

    使用FTPClient实现ftp文件上传

    在本文中,我们将深入探讨如何使用FTPClient来实现FTP文件上传,特别是处理中文文件名的上传问题。 FTP是一种广泛使用的互联网协议,允许用户在两台计算机之间传输文件。在Java中,我们可以利用Apache Commons Net...

    java ftpClient 连接池设计

    Apache Commons Net库提供了一个名为`FTPClient`的类,它实现了FTP协议的主要功能,如登录、上传、下载、列出目录等。在使用FTPClient时,我们通常会进行以下步骤: 1. 创建`FTPClient`实例。 2. 连接到FTP服务器,...

    JAVA实现简单的对FTP上传与下载

    总的来说,使用Java实现FTP上传和下载涉及网络通信、文件操作和错误处理等多个方面的知识。通过"ftpLoadDown.jar"库,我们可以简化这个过程,使得开发者可以专注于业务逻辑,而无需关心底层的FTP协议细节。在实际...

    FTPClient用于java开发FTP客户端

    在Java中,FTPClient库提供了一个丰富的API,允许开发者执行各种FTP操作,如连接到FTP服务器、登录、上传文件、下载文件、改变目录、列出目录内容等。这个库不仅支持标准的FTP协议,还支持FTP over SSL/TLS(FTPS)...

    java FTP 上传 下载 (中文 ) 文件

    以下是一个使用Apache Commons Net库进行FTP上传和下载的简单示例: 1. **FTP连接**: - 导入必要的库:`import org.apache.commons.net.ftp.FTP;` 和 `import org.apache.commons.net.ftp.FTPClient;` - 创建`...

    java写的ftp下载上传定时监控

    Java作为多平台支持的编程语言,提供了丰富的库和工具来实现FTP功能,包括下载、上传文件以及定时监控等操作。本篇文章将深入探讨如何使用Java进行FTP文件传输,并涉及自动解压和压缩的功能。 首先,让我们关注Java...

    JAVA实现ftp上传,下载

    总结,Java实现FTP上传和下载需要借助Apache Commons Net库,通过FTPClient类进行操作。同时,如果涉及XML文件,还需要理解并应用DOM、SAX或StAX解析技术。在实现过程中,要注意文件流的管理和异常处理,确保操作的...

Global site tag (gtag.js) - Google Analytics