EDI中JAVA通过FTP工具实现文件上传下载实例

 更新时间:2016年11月07日 15:59:35   作者:Jay_1989  
这篇文章主要介绍了EDI中JAVA通过FTP工具实现文件上传下载实例,具有一定的参考价值,有需要的可以了解一下。

最近接手一个EDI项目,收获颇多。其实我在第一家公司是接触过EDI的,当初我们用EDI主要实现了订单数据传输,客户向我们下达采购订单,通过VPN及FTP工具将采购订单以约定的报文形式放到指定的文件服务器中,然后我们EDI系统会定时去文件服务器中获取报文,最后解析并生成我们的销售订单。这些年过去了,我仍记着当初用的最多的是EDI850、EDI855。

 一、首先介绍一下EDI的概念

Electronic data interchange,电子数据交换。

EDI其实就是把原来纸质的订单/发货通知等业务单据,从传真/快递等传统方式,变成在线的电子数据方式进行交互,从而提高业务效率。同时,通过一些EDI软件的实施配置,往往可以直接从企业的业务系统生成出相应的单据数据,并自动传送至客户/供应商处,实现Application to Application的效果,避免纸质单据中人为造成的错误(如数据错误等)。所以IT系统完善的大公司更喜欢EDI,因为EDI对于业务人员是透明的,业务人员操作自己日常的业务系统就可以了。

EDI依赖于几个部分:

1、EDI传输途径,一般EDI通过AS2协议、FTP/S等进行直联,也可以通过第三方的VAN(增值网)服务商中转(这个和我们使用电子邮件的模式相同)。因为涉及到业务信息,传输安全要求会比较高;

2、EDI标准,即业务数据的组织形式,目前最常用的美标的ANSI X12和联合国和欧盟的EDIFact,当然还有很多其他标准,只要EDI双方遵循同一标准,就可以很好的实现EDI交互;

3、两端的EDI软件(环境),一般最好的实现方式是由EDI软件自动收发EDI报文(数据文件),并自动集成到企业业务系统中。

其中传输途径中,我们采用的是FTP进行文件传输的,这里我主要介绍一下Java是如何通过FTP工具进行文件的上传与下载,这里我们的FTP服务器是Linux操作系统。

二、JAVA架包引用

其中“commons-net-1.4.1.jar”、“jakarta-oro-2.0.8.jar”点击链接均可直接下载,并且确保是可以用的,大家可以放心下载。

三、文件路径
客户端需要上传的文件夹路径"E:\edi\edi850",默认是将该文件夹下所有文件上传
FTP服务器端上传路径为“/home/test/edi850”,如果上传为路径则FTP服务器会建立对应同样的路径

四、JAVA代码
FTP类

package com.pcmall; 
 
public class Ftp { 
  private String ipAddr;// ip地址 
  private Integer port;// 端口号 
  private String userName;// 用户名 
  private String pwd;// 密码 
  private String path;// 路径 
 
  public String getIpAddr() { 
    return ipAddr; 
  } 
 
  public void setIpAddr(String ipAddr) { 
    this.ipAddr = ipAddr; 
  } 
 
  public Integer getPort() { 
    return port; 
  } 
 
  public void setPort(Integer port) { 
    this.port = port; 
  } 
 
  public String getUserName() { 
    return userName; 
  } 
 
  public void setUserName(String userName) { 
    this.userName = userName; 
  } 
 
  public String getPwd() { 
    return pwd; 
  } 
 
  public void setPwd(String pwd) { 
    this.pwd = pwd; 
  } 
 
  public String getPath() { 
    return path; 
  } 
 
  public void setPath(String path) { 
    this.path = path; 
  } 
} 

FtpUtil类

package com.pcmall; 
 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
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; 
import org.apache.log4j.Logger; 
 
public class FtpUtil { 
 
  private static Logger logger = Logger.getLogger(FtpUtil.class); 
 
  private static FTPClient ftp; 
 
  /** 
   * 获取ftp连接 
   * 
   * @param f 
   * @return 
   * @throws Exception 
   */ 
  public static boolean connectFtp(Ftp f) throws Exception { 
    ftp = new FTPClient(); 
    boolean flag = false; 
    int reply; 
    if (f.getPort() == null) { 
      ftp.connect(f.getIpAddr(), 21); 
    } else { 
      ftp.connect(f.getIpAddr(), f.getPort()); 
    } 
    ftp.login(f.getUserName(), f.getPwd()); 
    ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
    reply = ftp.getReplyCode(); 
    if (!FTPReply.isPositiveCompletion(reply)) { 
      ftp.disconnect(); 
      return flag; 
    } 
    ftp.changeWorkingDirectory(f.getPath()); 
    flag = true; 
    return flag; 
  } 
 
  /** 
   * 关闭ftp连接 
   */ 
  public static void closeFtp() { 
    if (ftp != null && ftp.isConnected()) { 
      try { 
        ftp.logout(); 
        ftp.disconnect(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
 
  /** 
   * ftp上传文件 
   * 
   * @param f 
   * @throws Exception 
   */ 
  public static void upload(File f) throws Exception { 
    if (f.isDirectory()) { 
      ftp.makeDirectory(f.getName()); 
      ftp.changeWorkingDirectory(f.getName()); 
      String[] files = f.list(); 
      for (String fstr : files) { 
        File file1 = new File(f.getPath() + "/" + fstr); 
        if (file1.isDirectory()) { 
          upload(file1); 
          ftp.changeToParentDirectory(); 
        } else { 
          File file2 = new File(f.getPath() + "/" + fstr); 
          FileInputStream input = new FileInputStream(file2); 
          ftp.storeFile(file2.getName(), input); 
          input.close(); 
        } 
      } 
    } else { 
      File file2 = new File(f.getPath()); 
      FileInputStream input = new FileInputStream(file2); 
      ftp.storeFile(file2.getName(), input); 
      input.close(); 
    } 
  } 
 
  /** 
   * 下载链接配置 
   * 
   * @param f 
   * @param localBaseDir 
   *      本地目录 
   * @param remoteBaseDir 
   *      远程目录 
   * @throws Exception 
   */ 
  public static void startDown(Ftp f, String localBaseDir, 
      String remoteBaseDir) throws Exception { 
    if (FtpUtil.connectFtp(f)) { 
 
      try { 
        FTPFile[] files = null; 
        boolean changedir = ftp.changeWorkingDirectory(remoteBaseDir); 
        if (changedir) { 
          ftp.setControlEncoding("GBK"); 
          files = ftp.listFiles(); 
          for (int i = 0; i < files.length; i++) { 
            try { 
              downloadFile(files[i], localBaseDir, remoteBaseDir); 
            } catch (Exception e) { 
              logger.error(e); 
              logger.error("<" + files[i].getName() + ">下载失败"); 
            } 
          } 
        } 
      } catch (Exception e) { 
        logger.error(e); 
        logger.error("下载过程中出现异常"); 
      } 
    } else { 
      logger.error("链接失败!"); 
    } 
 
  } 
 
  /** 
   * 
   * 下载FTP文件 当你需要下载FTP文件的时候,调用此方法 根据<b>获取的文件名,本地地址,远程地址</b>进行下载 
   * 
   * @param ftpFile 
   * @param relativeLocalPath 
   * @param relativeRemotePath 
   */ 
  private static void downloadFile(FTPFile ftpFile, String relativeLocalPath, 
      String relativeRemotePath) { 
    if (ftpFile.isFile()) { 
      if (ftpFile.getName().indexOf("?") == -1) { 
        OutputStream outputStream = null; 
        try { 
          File locaFile = new File(relativeLocalPath 
              + ftpFile.getName()); 
          // 判断文件是否存在,存在则返回 
          if (locaFile.exists()) { 
            return; 
          } else { 
            outputStream = new FileOutputStream(relativeLocalPath 
                + ftpFile.getName()); 
            ftp.retrieveFile(ftpFile.getName(), outputStream); 
            outputStream.flush(); 
            outputStream.close(); 
          } 
        } catch (Exception e) { 
          logger.error(e); 
        } finally { 
          try { 
            if (outputStream != null) { 
              outputStream.close(); 
            } 
          } catch (IOException e) { 
            logger.error("输出文件流异常"); 
          } 
        } 
      } 
    } else { 
      String newlocalRelatePath = relativeLocalPath + ftpFile.getName(); 
      String newRemote = new String(relativeRemotePath 
          + ftpFile.getName().toString()); 
      File fl = new File(newlocalRelatePath); 
      if (!fl.exists()) { 
        fl.mkdirs(); 
      } 
      try { 
        newlocalRelatePath = newlocalRelatePath + '/'; 
        newRemote = newRemote + "/"; 
        String currentWorkDir = ftpFile.getName().toString(); 
        boolean changedir = ftp.changeWorkingDirectory(currentWorkDir); 
        if (changedir) { 
          FTPFile[] files = null; 
          files = ftp.listFiles(); 
          for (int i = 0; i < files.length; i++) { 
            downloadFile(files[i], newlocalRelatePath, newRemote); 
          } 
        } 
        if (changedir) { 
          ftp.changeToParentDirectory(); 
        } 
      } catch (Exception e) { 
        logger.error(e); 
      } 
    } 
  } 
 
  public static void main(String[] args) throws Exception { 
    Ftp ftp = new Ftp(); 
    ftp.setIpAddr("192.168.16.128"); 
    ftp.setUserName("test"); 
    ftp.setPwd("123456"); 
    FtpUtil.connectFtp(ftp); 
    File file = new File("E:/edi/edi850/");//如果是路径则将上传该路径下所有文件,如果是文件则上传该文件 
    FtpUtil.upload(file);// 把文件上传在ftp上 
    FtpUtil.startDown(ftp, "E:/FTPTEST/", "/home/test/edi850");// 下载ftp文件测试,第二个参数为客户端下载地址,第三个参数为文件服务器下载路径 
    System.out.println("ok"); 
 
  } 
 
} 

上传成功后,FTP文件服务器文件情况如下

下载成功后,客户端文件如下
打开后,文件内容如下
好了,EDI中如何通过FTP工具进行文件的上传与下载先介绍到这里,以上代码本人均亲自测试,可以运行。

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

相关文章

  • MyBatis注解实现动态SQL问题

    MyBatis注解实现动态SQL问题

    这篇文章主要介绍了MyBatis注解实现动态SQL问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java中的Semaphore信号量深入解析

    Java中的Semaphore信号量深入解析

    这篇文章主要介绍了Java中的Semaphore信号量深入解析,Semaphore是Java里面另外一个基本的并发工具包类,主要的的作用是用来保护共享资源的访问的,也就是仅仅允许一定数量的线程访问共享资源,需要的朋友可以参考下
    2023-11-11
  • 使用SpringCloudAlibaba整合Dubbo

    使用SpringCloudAlibaba整合Dubbo

    这篇文章主要介绍了使用SpringCloudAlibaba整合Dubbo,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • idea在运行期间,实现让修改的页面实时生效

    idea在运行期间,实现让修改的页面实时生效

    这篇文章主要介绍了idea在运行期间,实现让修改的页面实时生效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java中常用工具类之字符串操作类和MD5加密解密类

    java中常用工具类之字符串操作类和MD5加密解密类

    这篇文章主要介绍了java中常用工具类之字符串操作类和MD5加密解密类,需要的朋友可以参考下
    2014-07-07
  • Spring Kafka中如何通过参数配置解决超时问题详解

    Spring Kafka中如何通过参数配置解决超时问题详解

    这篇文章主要给大家介绍了关于Spring Kafka中如何通过参数配置解决超时问题的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • spring boot启动时mybatis报循环依赖的错误(推荐)

    spring boot启动时mybatis报循环依赖的错误(推荐)

    今天小编抽时间给大家分享spring boot启动时mybatis报循环依赖的错误,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-12-12
  • 搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)

    搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)

    这篇文章主要为大家介绍了搜索一文入门ElasticSearch(节点 分片 CRUD 倒排索引 分词)的基础详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java实现数据更新和事件通知的观察者模式

    Java实现数据更新和事件通知的观察者模式

    Java观察者模式是一种行为型设计模式,用于实现对象间的一对多依赖关系。当一个对象的状态发生改变时,它的所有依赖对象都会收到通知并自动更新。观察者模式可以实现松耦合,增强了系统的可维护性和可拓展性
    2023-04-04
  • SpringBoot项目application.yml文件数据库配置密码加密的方法

    SpringBoot项目application.yml文件数据库配置密码加密的方法

    这篇文章主要介绍了SpringBoot项目application.yml文件数据库配置密码加密的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论