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

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

以上是 EDI中JAVA通过FTP工具实现文件上传下载实例 的全部内容, 来源链接: utcz.com/p/210354.html

回到顶部