`
zengshaotao
  • 浏览: 788838 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ftp上传

 
阅读更多

一,    安装filezilie-u ftp服务器

 

我所设服务器配置:

 

用户名:zst

 

密码:123456

 

端口:21

 

跟目录:D:/ftp

 

 

 

 

 

二、所需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、以后再上传中文文件,就不会出现乱码问题啦。

 

分享到:
评论

相关推荐

    FTP控件_ftp上传_文件上传_ftp控件_FTP上传控件_

    "FTP上传控件"是专为实现文件上传功能而设计的,它简化了FTP客户端的实现过程,开发者无需深入了解FTP协议的细节,就能在应用中实现文件上传功能。"FTP上传控件"的关键特性包括支持超大文件上传和断点续传。 超大...

    Labview FTP上传文件

    Labview FTP上传文件是利用Labview(Laboratory Virtual Instrument Engineering Workbench)这一强大的图形化编程环境,通过FTP(File Transfer Protocol)协议实现文件的远程传输。FTP是一种标准网络协议,用于在...

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

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

    VB API 实现FTP上传下载源代码

    **VB API FTP上传下载源代码详解** 在信息技术领域,FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议。在VB(Visual Basic)环境中,我们可以使用API(Application Programming Interface...

    golang实现ftp上传资源

    在"Go实现FTP上传资源"这个主题中,我们需要关注以下几个关键知识点: 1. **FTP协议基础**:FTP协议由两部分组成,即控制连接和数据连接。控制连接用于发送命令和接收响应,数据连接则用于实际的文件传输。FTP支持...

    C++ libcurl ftp上传文件

    BoschNetConn可能是你的项目或库的名字,它可能封装了这些libcurl的FTP上传操作,提供了一种更方便的方式来处理网络连接。如果你正在使用这个库,你应该查阅其文档以了解如何具体使用它的API来上传文件。 总之,C++...

    FTP上传与下载程序PB

    在这个"FTP上传与下载程序PB"的案例中,我们将会探讨如何使用PowerBuilder来实现FTP功能,包括文件的上传和下载,以及可能涉及的自动升级机制。 首先,理解FTP的基本概念至关重要。FTP允许用户在两台计算机之间交换...

    FTP上传实例(带进度条)

    这个FTP上传实例提供了可视化的进度反馈,使得用户能够清晰地看到文件上传的进度,提高了用户体验。 FTP上传的核心原理是通过FTP客户端连接到FTP服务器,然后将本地文件分块发送到服务器。在这个过程中,通过跟踪已...

    winform实现FTP上传、下载、删除文件

    **FTP上传文件:** 要实现FTP文件上传,我们首先创建一个`FtpWebRequest`对象,设置其方法为`WebMethod.UploadFile`,然后提供FTP服务器的URL、用户名和密码。接着,打开一个流写入器,将本地文件内容写入请求的主体...

    FTP上传(断点续传)更新进度条

    FTP上传和断点续传是网络传输中两个重要的概念,特别是在大文件传输场景下,而更新进度条则是提升用户体验的关键元素。在这个公司项目的第一个版本中,我们关注的是如何实现一个功能完善的FTP上传系统,该系统支持...

    FTP上传 实现网站预览

    FTP上传实现网站预览的过程涉及多个步骤和技术,下面将详细解释这一过程。 1. FTP客户端与服务器: FTP服务需要一个服务器端和客户端。服务器端是存储网站文件的地方,而客户端是用户用来连接服务器并管理文件的...

    curl实现ftp上传下载

    FTP上传涉及到将本地文件发送到远程FTP服务器。使用libcurl,我们可以通过以下步骤实现: 1. **初始化libcurl**:创建一个`CURL`指针,并调用`curl_global_init()`初始化全局设置。 2. **设置URL**:使用`curl_...

    萤石云摄像头自动截图以及FTP上传

    萤石云摄像头自动截图以及FTP上传是一个集成自动化与远程存储功能的系统,它结合了现代监控设备的技术优势,为用户提供了一种高效、便捷的方式来管理和获取摄像头捕获的图像。在这个系统中,萤石云摄像头扮演着核心...

    Delphi Ftp上传程序

    Delphi FTP上传程序是使用Delphi7开发的一个应用程序,它实现了通过FTP(文件传输协议)将本地文件上传到远程服务器的功能。FTP是一种广泛用于互联网上的标准协议,允许用户在计算机之间传输文件。在这个项目中,...

    ftp上传程序(典型的ftp上传应用)

    FTP上传程序就是实现这一功能的应用,允许用户将本地计算机上的文件或目录上传到远程FTP服务器上。这种程序通常具有用户友好的界面,简化了文件传输过程。 在"FTP上传程序(典型的ftp上传应用)"中,重点在于程序...

    FTP上传与下载pb9.0code

    标题“FTP上传与下载pb9.0code”指的是使用PowerBuilder 9.0(简称PB9)开发的一个程序,该程序实现了FTP(File Transfer Protocol)的上传和下载功能。PowerBuilder是一款强大的可视化编程工具,特别适合于构建...

    ftp上传demo

    FTP(File Transfer Protocol)是一种基于TCP/IP协议的...综上所述,FTP上传涉及到网络通信、身份验证、文件操作等多个方面,理解并熟练运用FTP上传能有效提高工作效率,特别是在需要跨网络共享和管理文件的环境中。

    ftp上传工具, 上传ftp服务器

    在这个场景中,我们关注的是一个基于Java开发的FTP上传工具,它能够帮助用户将本地文件上传到FTP服务器。以下是一些关于FTP上传工具和相关技术的知识点: 1. **FTP基本概念**: FTP是一个应用层协议,基于TCP/IP...

    非常好用的ftp上传工具

    很好用的ftp上传工具,上传速度也很快,很好用的ftp上传工具,上传速度也很快,很好用的ftp上传工具,上传速度也很快,

    VC++ FTP上传下载

    在VC++中实现FTP上传和下载功能,开发者通常会利用WinInet库或第三方FTP库。 首先,让我们深入了解一下FTP上传。FTP上传是指将本地计算机上的文件发送到FTP服务器的过程。在VC++中,可以使用WinInet API来实现这一...

Global site tag (gtag.js) - Google Analytics