当前位置: 移动技术网 > IT编程>开发语言>Java > EDI中JAVA通过FTP工具实现文件上传下载实例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论
最近接手一个edi项目,收获颇多。其实我在第一家公司是接触过edi的,当初我们用edi主要实现了订单数据传输,客户向我们下达采购订单,通过vpn及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工具进行文件的上传与下载先介绍到这里,以上代码本人均亲自测试,可以运行。

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网