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

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索.net ftp上传文件实例、java实现ftp上传下载、java实现ftp上传文件、web页面 实现 ftp上传、js实现ftp上传,以便于您获取更多的相关知识。

时间: 2024-12-02 21:10:13

EDI中JAVA通过FTP工具实现文件上传下载实例_java的相关文章

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

本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比较通用且功能较强的j-ftp类库,对一些比较常见的功能如进度条.断点续传.内外网的映射.在Applet中回调JavaScript函数等问题进行详细的阐述及代码实现,希望通过此文起到一个抛砖引玉的作用. 一.引子 笔者在实施一个项目过程中出现了一种基于Web的文件上传下载需求.在全省(或全国)各地的用

JavaWeb文件上传下载实例讲解(酷炫的文件上传技术)_java

一.课程概述 在Web应用系统开发中,文件上传功能是非常常用的功能,今天来主要讲讲JavaWeb中的文件上传功能的相关技术实现,并且随着互联网技术的飞速发展,用户对网站的体验要求越来越高,在文件上传功能的技术上也出现许多创新点,例如异步上传文件,拖拽式上传,黏贴上传,上传进度监控,文件缩略图,大文件断点续传,大文件秒传等等. 本课程需要的基础知识: 了解基本的Http协议内容 基本IO流操作技术 Servlet基础知识 javascript/jQuery技术基础知识 二.文件上传的基础 对于文件

最详细的文件上传下载实例详解(推荐)_java

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

PHP实现文件上传下载实例_php实例

本文介绍了PHP实现文件上传与下载,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 一.上传原理与配置 1.1 原理 将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可. 1.2 客户端配置 所需:表单页面(选择上传文件): 具体而言:发送方式为POST,添加enctype="multipart/form-data"属性,两者缺一不可(但是,优缺点并存,这里也限定了上传的方式和上传的文件之后的调用等方面,后面会说到) <!DOCTYPE h

JAVA中使用FTPClient实现文件上传下载实例代码_java

在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件.下载文件,本文给大家介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

java中struts2实现文件上传下载功能_java

先谈一谈struts2实现文件的上传和下载实例实现的原理: Struts 2是通过Commons FileUpload文件上传. Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中.从而我们就能够以本地文件方式的操作浏览器上传的文件. 具体实现: 一.创建index.jsp页面 <body> <s:form action="upload" method="p

PHP实现文件上传下载实例

本文介绍了PHP实现文件上传与下载,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 一.上传原理与配置 1.1 原理 将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可. 1.2 客户端配置 所需:表单页面(选择上传文件): 具体而言:发送方式为POST,添加enctype="multipart/form-data"属性,两者缺一不可(但是,优缺点并存,这里也限定了上传的方式和上传的文件之后的调用等方面,后面会说到) <!DOCTYPE h

使用嵌套字用FTP协议进行文件上传下载!

 以下代码使用C#完成!完成.    using System;using System.Net.Sockets; /// <summary>/// Ftp 的摘要说明./// </summary>public class Ftp{  public Ftp()  {   //   // TODO: 在此处添加构造函数逻辑   //  }  string _ser;  public string Server  {   set{ _ser=value;}   get{return _

java 如何实现远程的文件上传下载?

问题描述 请教高手,如题.用SE写.请稍微详细一下,感谢万分! 解决方案 解决方案二:用socket和流就可以实现了分解你的题目,"文件"的"上传和下载".socket可以实现通讯,他有个方法可以实现流的传输.你只要把文件转换成指定的流就可以了.解决方案三:LZ可以参考解决方案四:用socket和流就可以实现了解决方案五:引用2楼bolink5的回复: LZ可以参考http://topic.csdn.net/u/20080720/13/D9EF0962-1406-4