Java 实现FTP服务实例详解

Java 实现FTP服务实例详解

1、FTP简介

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

2、实例

2.1、添加依赖

<!-- 文件上传组件 -->
 <dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
 </dependency>

2.2测试类

package testController; 

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.chenzhengyou.common.util.FtpUtil;
import org.junit.Test; 

import java.io.File;
import java.io.FileInputStream; 

/**
 * @auther 陈郑游
 * @create 2016-11-23-19:27
 * @功能描述 图片测试
 * @公司地址
 */ 

public class FtpController { 

  //主机地址 端口号
  private String HOSTNAME = "127.0.0.1";
  private Integer PORT = 21;
  //本地图片路径
  private String FilePackage = "F:\\Programming_Package\\IMG_3733_1.JPG"; 

  //用户名 密码
  private String USERNAME = "czy";
  private String PASSWORD = "czy"; 

  /**
   * 无工具类图片测试
   * */
  @Test
  public void testFtp() throws Exception {
    //创建一个FtpClient对象
    FTPClient ftpClient = new FTPClient();
    //创建ftp连接。默认是21端口
    ftpClient.connect(HOSTNAME,PORT);
    //登录ftp服务器,使用用户名和密码
    ftpClient.login(USERNAME,PASSWORD);
    //上传文件。
    //读取本地文件
    FileInputStream inputStream = new FileInputStream(new File(FilePackage));
    //设置上传的路径
    ftpClient.changeWorkingDirectory("/myftp/images");
    //修改上传文件的格式
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    //第一个参数:服务器端文档名
    //第二个参数:上传文档的inputStream
    ftpClient.storeFile("hello.jpg", inputStream);
    //关闭连接
    ftpClient.logout();
  }
}

2.3、FTP工具类上传图片

工具类

package org.chenzhengyou.common.util; 

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply; 

import java.io.*; 

/**
 * @auther 陈郑游
 * @create 2016-11-23-19:27
 * @功能描述 ftp工具类
 * @公司地址
 */
public class FtpUtil { 

  /**
   * Description: 向FTP服务器上传文件
   * @param host FTP服务器hostname
   * @param port FTP服务器端口
   * @param username FTP登录账号
   * @param password FTP登录密码
   * @param basePath FTP服务器基础目录
   * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
   * @param filename 上传到FTP服务器上的文件名
   * @param input 输入流
   * @return 成功返回true,否则返回false
   */
  public static boolean uploadFile(String host, int port, String username,
                   String password, String basePath,
      String filePath, String filename, InputStream input) { 

    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(host, port);// 连接FTP服务器
      // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
      ftp.login(username, password);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return result;
      }
      //切换到上传目录
      if (!ftp.changeWorkingDirectory(basePath+filePath)) {
        //如果目录不存在创建目录
        String[] dirs = filePath.split("/");
        String tempPath = basePath;
        for (String dir : dirs) {
          if (null == dir || "".equals(dir)) continue;
          tempPath += "/" + dir;
          if (!ftp.changeWorkingDirectory(tempPath)) {
            if (!ftp.makeDirectory(tempPath)) {
              return result;
            } else {
              ftp.changeWorkingDirectory(tempPath);
            }
          }
        }
      }
      //设置上传文件的类型为二进制类型
      ftp.setFileType(FTP.BINARY_FILE_TYPE);
      //上传文件
      if (!ftp.storeFile(filename, input)) {
        return result;
      }
      input.close();
      ftp.logout();
      result = true;
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ioe) {
        }
      }
    }
    return result;
  } 

  /**
   * Description: 从FTP服务器下载文件
   * @param host FTP服务器hostname
   * @param port FTP服务器端口
   * @param username FTP登录账号
   * @param password FTP登录密码
   * @param remotePath FTP服务器上的相对路径
   * @param fileName 要下载的文件名
   * @param localPath 下载后保存到本地的路径
   * @return
   */
  public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
      String fileName, String localPath) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(host, port);
      // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
      ftp.login(username, password);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return result;
      }
      ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
      FTPFile[] fs = ftp.listFiles();
      for (FTPFile ff : fs) {
        if (ff.getName().equals(fileName)) {
          File localFile = new File(localPath + "/" + ff.getName()); 

          OutputStream is = new FileOutputStream(localFile);
          ftp.retrieveFile(ff.getName(), is);
          is.close();
        }
      } 

      ftp.logout();
      result = true;
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ioe) {
        }
      }
    }
    return result;
  }
}

实现类

package testController; 

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.chenzhengyou.common.util.FtpUtil;
import org.junit.Test; 

import java.io.File;
import java.io.FileInputStream; 

/**
 * @auther 陈郑游
 * @create 2016-11-23-19:27
 * @功能描述 图片测试
 * @公司地址
 */ 

public class FtpController { 

  //主机地址 端口号
  private String HOSTNAME = "127.0.0.1";
  private Integer PORT = 21;
  //本地图片路径
  private String FilePackage = "F:\\Programming_Package\\IMG_3733_1.JPG"; 

  //用户名 密码
  private String USERNAME = "czy";
  private String PASSWORD = "czy"; 

  /**
   * 有工具类测试
   * */
  @Test
  public void testUtil() throws Exception {
    FileInputStream inputStream = new FileInputStream(new File("F:\\Programming_Package\\IMG_3733_1.JPG"));
    FtpUtil.uploadFile(HOSTNAME,PORT, USERNAME, PASSWORD, "/myftp/images", "/2016/11/24", "hello.jpg", inputStream);
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

    本文为大家介绍了FTP上传下载队列窗口的实现方法,供大家参考,具体内容如下 1.首先看一下队列窗口的界面 2.看一下上传队列窗口的界面 3.看一下下载队列窗口的界面 package com.oyp.ftp.panel.queue; import static java.awt.BorderLayout.CENTER; import static java.awt.BorderLayout.EAST; import static javax.swing.ListSelectionModel.SIN

  • Java语言实现简单FTP软件 FTP连接管理模块实现(8)

    本文为大家介绍了FTP连接管理模块的实现方法,供大家参考,具体内容如下 (1)FTP连接 运行FTP客户端后,首先是连接FTP服务器,需要输入FTP服务器的IP地址及用户名.密码以及端口号后点击连接按钮开始连接FTP服务器,连接流程图如下图所示. 点击"连接"按钮后,会调用com.oyp.ftp.FTPClientFrame类的linkButtonActionPerformed(ActionEvent evt)方法,其主要代码程序如下 /** * 连接按钮的事件处理方法 */ riva

  • Java语言实现简单FTP软件 FTP软件本地窗口实现(5)

    本文为大家介绍了FTP软件本地窗口的实现方法,供大家参考,具体内容如下 1.首先看一下本地窗口的布局效果 2.看一下本地窗口实现的代码框架 3.本地窗口的具体实现代码LocalPanel.java package com.oyp.ftp.panel.local; import java.awt.Color; import java.awt.Desktop; import java.awt.Dimension; import java.awt.event.ItemEvent; import jav

  • Java语言实现简单FTP软件 FTP本地文件管理模块实现(9)

    本文为大家分享了FTP本地文件管理模块的实现方法,供大家参考,具体内容如下 首先看一下界面: 1.本地文件列表的显示功能 将本地的当前目录下所有文件显示出来,并显示文件的属性包括文件名.大小.日期.通过javax.swing.JTable()来显示具体的数据.更改当前文件目录会调用com.oyp.ftp.panel.local.LocalPanel类的listLocalFiles()方法,其主要代码如下 /** * 读取本地文件到表格的方法 */ private void listLocalFi

  • java判断ftp目录是否存在的方法

    本文为大家分享了java判断ftp目录是否存在的方法,供大家参考,具体内容如下 package com.soft4j.log4j; import java.io.IOException; import sun.net.ftp.FtpClient; public class FtpTest { static String middle_ftpServer = "10.103.2.250"; static String middle_user = "ora9iftp";

  • JAVA SFTP文件上传、下载及批量下载实例

    1.jsch官方API查看地址(附件为需要的jar) http://www.jcraft.com/jsch/ 2.jsch简介 JSch(Java Secure Channel)是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. SFTP(Secure File Transfer Protocol)安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输

  • Java 实现FTP服务实例详解

    Java 实现FTP服务实例详解 1.FTP简介 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件.在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)."

  • java 回调机制的实例详解

    java 回调机制的实例详解 序言 最近接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上

  • Java Executor 框架的实例详解

    Java Executor 框架的实例详解 大多数并发都是通过任务执行的方式来实现的. 一般有两种方式执行任务:串行和并行. class SingleThreadWebServer { public static void main(String[] args) throws Exception { ServerSocket socket = new ServerSocket(80); while(true) { Socket conn = socket.accept(); handleRequ

  • Java多线程用法的实例详解

    Java多线程用法的实例详解 前言: 最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); p

  • ruby ftp封装实例详解

     ruby ftp封装实例详解 最近自己用ruby 封装了一个Net::FTP的工具类. class FtpTool def initialize() @current_ftp = create_ftp end # 获取指定格式的文件名称列表 # 例如: source = "test/*.txt" # 返回: [source/file_name.txt] def fetch_remote_filenames(source) return [] if source.blank? log_

  • Java 反射机制的实例详解

    Java 反射机制的实例详解 前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法. 反射

  • java 代理机制的实例详解

    java 代理机制的实例详解 前言: java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理两种,在运行时生成新的子类class文件.本文主要练习下动态代理,代码用于备忘.对于代理的原理和机制,网上有很多写的很好的,就不班门弄斧了. jdk代理 实例代码 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; publi

  • Java 序列化和反序列化实例详解

    Java 序列化和反序列化实例详解 在分布式应用中,对象只有经过序列化才能在各个分布式组件之间传输,这就涉及到两个方面的技术-发送者将对象序列化,接受者将对象反序列化,下面就是一个很好的例子! 1.实体-Employee import java.io.Serializable; public class Employee implements Serializable{ /** * */ private static final long serialVersionUID = 1L; publi

  • java 中匿名内部类的实例详解

    java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈"); System.out.println("超级女声"); } TT tt=new TT(); tt.show(); 只是说我们这里采用的是匿名的形式来处理. 重写了Test的show()方法,在重写好了以后,又调用了重写后的show()方法 实现代码: package cn.com; c

  • Java中File的实例详解

    Java中File的实例详解 File 代表文件或者目录的类 构造函数 File(File parent,String child)---代表了指定父目录下的指定的子文件或者子目录 File(String pathname)---代表了指定路径对应的文件或者目录对象 重要方法 创建 createNewFile()---只能用来创建文件,并且一次只能创建一个文件,要求文件存储的目录必须真实存在 mkdir()---只能用来创建目录,不能用来创建多层目录 mkdirs()---创建多层目录 删除 d

随机推荐