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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值