Java实现跨服务器上传文件功能

 更新时间:2018年01月13日 10:39:34   作者:Wu_Fei_Li  
这篇文章主要为大家详细介绍了Java实现跨服务器上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前几天做个项目,本身客户端和管理员端是写在一起的,共用一台服务器,客户上传的文件都是存在服务器的硬盘上的。老龙提出要把客户端和管理员端分离,这时候用户上传的附件的存储就出现问题了。显然,把大到几百M的apk文件存到数据库不现实,查了半天,在两端建立ftp服务器传文件是最快的方法。

具体流程是,用户登录外网客户端,上传文件到外网的服务器硬盘上,在此同时,文件通过外网服务器访问内网管理员服务器的ftp服务器,传到内网服务器的硬盘上。这样内网服务器可以对上传的文件进行加密签名工作,之后也通过ftp的方式把文件回传到外网服务器硬盘上,供用户进行其他操作。

具体实现时用到的工具:Serv-U。Serv-U是一个方便我们在windows上建立ftp服务器的工具。下载破解后,按照步骤,设置好Ip、端口、账户密码、允许ftp访问的磁盘路径、操作权限等,就可以使用了。IP在本机测试的时候就选127.0.0.1,内网测试时就选192.168.0.x。

在java项目中的实现,我自己写了个工具类,用到了apache的commons-net包,有上传,下载以及删除功能。附上代码:

package app.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 org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 
import org.apache.commons.net.ftp.FTPReply; 
 
/** 
 * FTP服务器工具类 
 * 
 */ 
public class FTPUtils { 
   
  /** 
   * 上传文件至FTP服务器 
   * 
   * @param url 
   *   服务器IP地址 
   * @param port 
   *   服务器端口 
   * @param userName 
   *   用户登录名 
   * @param password 
   *   用户登录密码 
   * @param storePath 
   *   服务器文件存储路径 
   * @param fileName 
   *   服务器文件存储名称 
   * @param is 
   *   文件输入流 
   * @return 
   *   <b>true</b>:上传成功 
   *   <br/> 
   *   <b>false</b>:上传失败 
   */ 
  public static boolean storeFile (String url, int port, String userName, String password, String storePath, String fileName, InputStream is) { 
    boolean result = false; 
    FTPClient ftp = new FTPClient(); 
    try { 
      // 连接至服务器,端口默认为21时,可直接通过URL连接 
      ftp.connect(url ,port); 
      // 登录服务器 
      ftp.login(userName, password); 
      // 判断返回码是否合法 
      if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { 
        // 不合法时断开连接 
        ftp.disconnect(); 
        // 结束程序 
        return result; 
      } 
      // 判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录 
      String s = "/"+storePath; 
      String[] dirs = s.split("/"); 
      ftp.changeWorkingDirectory("/");       
        //按顺序检查目录是否存在,不存在则创建目录  
        for(int i=1; dirs!=null&&i<dirs.length; i++) {  
          if(!ftp.changeWorkingDirectory(dirs[i])) {  
            if(ftp.makeDirectory(dirs[i])) {  
              if(!ftp.changeWorkingDirectory(dirs[i])) {  
                return false;  
              }  
            }else {  
              return false;              
            }  
          }  
        }  
      // 设置文件操作目录 
      ftp.changeWorkingDirectory(storePath); 
      // 设置文件类型,二进制 
      ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
      // 设置缓冲区大小 
      ftp.setBufferSize(3072); 
      // 上传文件 
      result = ftp.storeFile(fileName, is); 
      // 关闭输入流 
      is.close(); 
      // 登出服务器 
      ftp.logout(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        // 判断输入流是否存在 
        if (null != is) { 
          // 关闭输入流 
          is.close(); 
        } 
        // 判断连接是否存在 
        if (ftp.isConnected()) { 
          // 断开连接 
          ftp.disconnect(); 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
    return result; 
  } 
   
  /** 
   * 从FTP服务器下载文件至本地 
   * 
   * @param url 
   *   服务器IP地址 
   * @param port 
   *   服务器端口 
   * @param userName 
   *   用户登录名 
   * @param password 
   *   用户登录密码 
   * @param remotePath 
   *   服务器文件存储路径 
   * @param fileName 
   *   服务器文件存储名称 
   * @param localPath 
   *   本地文件存储路径 
   * @return 
   *   <b>true</b>:下载成功 
   *   <br/> 
   *   <b>false</b>:下载失败 
   */ 
  public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) { 
    boolean result = false; 
    FTPClient ftp = new FTPClient(); 
    OutputStream os = null; 
    try { 
      // 连接至服务器,端口默认为21时,可直接通过URL连接 
      ftp.connect(url ,port); 
      // 登录服务器 
      ftp.login(userName, password); 
      // 判断返回码是否合法 
      if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { 
        // 不合法时断开连接 
        ftp.disconnect(); 
        // 结束程序 
        return result; 
      } 
      // 设置文件操作目录 
      ftp.changeWorkingDirectory(remotePath); 
      // 设置文件类型,二进制 
      ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
      // 设置缓冲区大小 
      ftp.setBufferSize(3072); 
      // 设置字符编码 
      ftp.setControlEncoding("UTF-8"); 
      // 构造本地文件对象 
      File localFile = new File(localPath + "/" + fileName); 
      // 获取文件操作目录下所有文件名称 
      String[] remoteNames = ftp.listNames(); 
      // 循环比对文件名称,判断是否含有当前要下载的文件名 
      for (String remoteName: remoteNames) { 
        if (fileName.equals(remoteName)) { 
          result = true; 
        } 
      } 
      // 文件名称比对成功时,进入下载流程 
      if (result) { 
        // 构造文件输出流 
        os = new FileOutputStream(localFile); 
        // 下载文件 
        result = ftp.retrieveFile(fileName, os); 
        // 关闭输出流 
        os.close(); 
      } 
      // 登出服务器 
      ftp.logout(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        // 判断输出流是否存在 
        if (null != os) { 
          // 关闭输出流 
          os.close(); 
        } 
        // 判断连接是否存在 
        if (ftp.isConnected()) { 
          // 断开连接 
          ftp.disconnect(); 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
    return result; 
  } 
   
  /** 
   * 从FTP服务器删除文件 
   * 
   * @param url 
   *   服务器IP地址 
   * @param port 
   *   服务器端口 
   * @param userName 
   *   用户登录名 
   * @param password 
   *   用户登录密码 
   * @param remotePath 
   *   服务器文件存储路径 
   * @param fileName 
   *   服务器文件存储名称 
   * @return 
   *   <b>true</b>:删除成功 
   *   <br/> 
   *   <b>false</b>:删除失败 
   */ 
  public static boolean deleteFile (String url, int port, String userName, String password, String remotePath, String fileName) { 
    boolean result = false; 
    FTPClient ftp = new FTPClient(); 
    try { 
      // 连接至服务器,端口默认为21时,可直接通过URL连接 
      ftp.connect(url ,port); 
      // 登录服务器 
      ftp.login(userName, password); 
      // 判断返回码是否合法 
      if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { 
        // 不合法时断开连接 
        ftp.disconnect(); 
        // 结束程序 
        return result; 
      } 
      // 设置文件操作目录 
      ftp.changeWorkingDirectory(remotePath); 
      // 设置文件类型,二进制 
      ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
      // 设置缓冲区大小 
      ftp.setBufferSize(3072); 
      // 设置字符编码 
      ftp.setControlEncoding("UTF-8"); 
      // 获取文件操作目录下所有文件名称 
      String[] remoteNames = ftp.listNames(); 
      // 循环比对文件名称,判断是否含有当前要下载的文件名 
      for (String remoteName: remoteNames) { 
        if (fileName.equals(remoteName)) { 
          result = true; 
        } 
      } 
      // 文件名称比对成功时,进入删除流程 
      if (result) { 
        // 删除文件 
        result = ftp.deleteFile(fileName); 
      } 
      // 登出服务器 
      ftp.logout(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        // 判断连接是否存在 
        if (ftp.isConnected()) { 
          // 断开连接 
          ftp.disconnect(); 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
    return result; 
  }   
 
   
  public static void main(String[] args) throws FileNotFoundException { 
//   try { 
//     FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/软件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip")); 
//     System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", RandomUUID.random() + ".zip", fis)); 
//   } catch (FileNotFoundException e) { 
//     e.printStackTrace(); 
//   } 
//    
    //File file = new File("C:/Users/freed/Desktop/1.txt"); 
    //InputStream is = new FileInputStream(file); 
 
    //System.out.println(storeFile("127.0.0.1", 21, "feili", "feili", "examples", "2.txt", is)); 
    //System.out.println(retrieveFile("127.0.0.1", 21, "feili", "feili", "examples/jsp", "index.html", "C:/Users/freed/Desktop")); 
    //System.out.println(deleteFile("127.0.0.1", 21, "feili", "feili", "testpath", "1.txt")); 
 
  } 
 
   
} 

需要注意的是上传文件的时候要将File文件先放入fileinputstream中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合Java DL4J实现文本分类系统

    SpringBoot整合Java DL4J实现文本分类系统

    在当今信息爆炸的时代,自然语言处理领域中的文本分类显得尤为重要,文本分类能够高效地组织和管理海量的文本数据,随着互联网的飞速发展,我们每天都被大量的文本信息所包围,本文将介绍如何使用 Spring Boot 整合 Java Deeplearning4j 来构建一个文本分类系统
    2024-10-10
  • springboot整合Quartz实现动态配置定时任务的方法

    springboot整合Quartz实现动态配置定时任务的方法

    本篇文章主要介绍了springboot整合Quartz实现动态配置定时任务的方法,非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • Java实现Excel文件加密解密的示例代码

    Java实现Excel文件加密解密的示例代码

    设置excel文件保护时,通常可选择对整个工作簿进行加密保护。无需设置文档保护时,可撤销密码保护,即解密文档。本文将通过java程序演示以上加密、解密方法的实现,感兴趣的可以了解一下
    2022-05-05
  • Mybatis使用@Select注解sql中使用in问题

    Mybatis使用@Select注解sql中使用in问题

    这篇文章主要介绍了Mybatis使用@Select注解sql中使用in问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 微服务架构之使用RabbitMQ进行异步处理方式

    微服务架构之使用RabbitMQ进行异步处理方式

    本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在Spring Boot项目中使用RabbitMQ解决高并发问题,RabbitMQ是一种流行的消息队列实现,支持异步通信,可以有效解耦应用程序的不同部分,并将任务分发给多个消费者
    2025-02-02
  • SpringSecurity 手机号登录功能实现

    SpringSecurity 手机号登录功能实现

    这篇文章主要介绍了SpringSecurity 手机号登录功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2023-12-12
  • Mybatis plus的自动填充与乐观锁的实例详解(springboot)

    Mybatis plus的自动填充与乐观锁的实例详解(springboot)

    这篇文章主要介绍了Mybatis plus的自动填充与乐观锁的实例详解(springboot),本文给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 一篇文章带你了解spring事务失效的多种场景

    一篇文章带你了解spring事务失效的多种场景

    在日常编码过程中常常涉及到事务,在前两天看到一篇文章提到了Spring事务,那么在此总结下在Spring环境下事务失效的几种原因.
    2021-09-09
  • MyBatis与Hibernate的比较

    MyBatis与Hibernate的比较

    Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8。而Mybatis相对平静,工具较少,当前最高版本3.2
    2016-01-01
  • Java Spring IOC图文详解

    Java Spring IOC图文详解

    IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。下面通过本文给大家分享spring中ioc的概念,感兴趣的朋友一起看看吧
    2021-09-09

最新评论