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

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

时间: 2016-11-05

Java实现FTP批量大文件上传下载篇2

接着上一篇进行学习java文件上传下载1. 五.断点续传 对于熟用QQ的程序员,QQ的断点续传功能应该是印象很深刻的.因为它很实用也很方面.因此,在我们的上传下载过程中,很实现了断点续传的功能. 其实断点续传的原理很简单,就在上传的过程中,先去服务上进行查找,是否存在此文件,如果存在些文件,则比较服务器上文件的大小与本地文件的大小,如果服务器上的文件比本地的要小,则认为此文件上传过程中应该可以进行断点续传. 在实现的过程中,RandomAccessFile类变得很有用.此类的实例支持对随机存取文

Java实现ftp上传下载、删除文件及在ftp服务器上传文件夹的方法

一个JAVA 实现FTP功能的代码,包括了服务器的设置模块,并包括有上传文件至FTP的通用方法.下载文件的通用方法以及删除文件.在ftp服务器上传文件夹.检测文件夹是否存在等,里面的有些代码对编写JAVA文件上传或许有参考价值,Java FTP主文件代码: package ftpDemo; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import sun.net

Java通过FTP服务器上传下载文件的方法

对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案. 关于FileZilla Server服务器的详细搭建配置过程,详情请见FileZilla Server安装配置教程.之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲测上传2G的文件到FileZilla Server都没有该问题,朋友们可以放心使用该代码. FavFTPUtil.Java package com.favccxx.favsoft.util; import jav

java实现FTP文件上传与文件下载

本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下 第一种方式: package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.TelnetInputStream; import sun.net.TelnetO

Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp

JAVA技术实现上传下载文件到FTP服务器(完整)

具体详细介绍请看下文: 在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择.本文使用Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作. 关于FileZilla Server服务器的详细搭建配置过程,详情请见 FileZilla Server安装配置教程 .之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲

Java Spring MVC 上传下载文件配置及controller方法详解

下载: 1.在spring-mvc中配置(用于100M以下的文件下载) <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!--配置下载返回类型--> <bean class="or

java webservice上传下载文件代码分享

本文实例为大家分享了java webservice上传下载文件代码,供大家参考,具体内容如下 1.新建动态web工程youmeFileServer,新建包com,里面新建类FileProgress package com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Date; import java.text.Simple

python实现支持目录FTP上传下载文件的方法

本文实例讲述了python实现支持目录FTP上传下载文件的方法.分享给大家供大家参考.具体如下: 该程序支持ftp上传下载文件和目录.适用于windows和linux平台. #!/usr/bin/env python # -*- coding: utf-8 -*- import ftplib import os import sys class FTPSync(object): conn = ftplib.FTP() def __init__(self,host,port=21): self.c

使用smartupload组件实现jsp+jdbc上传下载文件实例解析

SmartUpload组件只有5个分别是:File.Files.Request.SmartUpload.SmartUploadException类,其中,File代表用户上传的文件,Files代表用户上传的多个文件,Request相当于HttpServletRequest的功能,用于获取表单数据,SmartUpload是最核心的类,负责文件上传下载,SmartUploadException是自定义异常.    SmartUpload的基本使用思路如下: jsp前台代码表单提交 <form act

python实现上传下载文件功能

最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify. 文件上传 - 后台view 的 Python代码如下: @csrf_exempt @require_http_methods(["POST"]) def uploadFiles(request): try: user = request.session.get('user') allFimeNames = "" #获取所有上传文件 files

python实现的简单FTP上传下载文件实例

本文实例讲述了python实现的简单FTP上传下载文件的方法.分享给大家供大家参考.具体如下: python本身自带一个FTP模块,可以实现上传下载的函数功能. #!/usr/bin/env python # -*- coding: utf-8 -*- from ftplib import FTP def ftp_up(filename = "20120904.rar"): ftp=FTP() ftp.set_debuglevel(2) #打开调试级别2,显示详细信息;0为关闭调试信息

java web图片上传和文件上传实例详解

java web图片上传和文件上传 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype="multipart/form-data" 2.为了能保证文件能上传成功file控件的name属性值要和你提交的控制层变量名一致, 例如空间名是file那么你要在后台这样定义 private File file; //file控件名 private String f

Linux下scp无密码上传 下载 文件 目录的方法

在Linux下远程备份的时候,需要配置scp的 无密码复制文件.目录.就把这个设置整理如下: 本地服务器:A 远程服务器:B 1.在 A 上运行 ssh-keygen -t rsa 在/root/.ssh 下生成id_rsa 和 id_rsa.pub 两个文件 在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A 如图所示 2. 在 B 上也同样运行 ssh-keygen -t rsa 3. 在 B 的 /root/.ssh 下创建authorized_ke

shell脚本实现ftp上传下载文件功能

前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在这台主机上将文件上传的目标ftp服务器. 1,建立主机A到其他三台主机之间的信任关系,以便于远程拷贝文件 #生成主机A的本地认证秘钥,可以选择生成rsa或者dsa类型的秘钥,这里选取rsa [root@A ~]#ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa >/d