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工具进行文件的上传与下载先介绍到这里,以上代码本人均亲自测试,可以运行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 浅谈Java后台对JSON格式的处理操作