这里有新鲜出炉的Java设计模式,程序狗速度看过来!
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了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工具进行文件的上传与下载先介绍到这里,以上代码本人均亲自测试,可以运行。
来源: http://www.phperz.com/article/17/1128/359471.html