首页 > 编程 > Java > 正文

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

2019-11-26 13:35:53
字体:
来源:转载
供稿:网友

最近接手一个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工具进行文件的上传与下载先介绍到这里,以上代码本人均亲自测试,可以运行。

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表