欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

EDI中JAVA通過FTP工具實現(xiàn)文件上傳下載實例

 更新時間:2016年11月07日 15:59:35   作者:Jay_1989  
這篇文章主要介紹了EDI中JAVA通過FTP工具實現(xiàn)文件上傳下載實例,具有一定的參考價值,有需要的可以了解一下。

最近接手一個EDI項目,收獲頗多。其實我在第一家公司是接觸過EDI的,當(dāng)初我們用EDI主要實現(xiàn)了訂單數(shù)據(jù)傳輸,客戶向我們下達(dá)采購訂單,通過VPN及FTP工具將采購訂單以約定的報文形式放到指定的文件服務(wù)器中,然后我們EDI系統(tǒng)會定時去文件服務(wù)器中獲取報文,最后解析并生成我們的銷售訂單。這些年過去了,我仍記著當(dāng)初用的最多的是EDI850、EDI855。

 一、首先介紹一下EDI的概念

Electronic data interchange,電子數(shù)據(jù)交換。

EDI其實就是把原來紙質(zhì)的訂單/發(fā)貨通知等業(yè)務(wù)單據(jù),從傳真/快遞等傳統(tǒng)方式,變成在線的電子數(shù)據(jù)方式進(jìn)行交互,從而提高業(yè)務(wù)效率。同時,通過一些EDI軟件的實施配置,往往可以直接從企業(yè)的業(yè)務(wù)系統(tǒng)生成出相應(yīng)的單據(jù)數(shù)據(jù),并自動傳送至客戶/供應(yīng)商處,實現(xiàn)Application to Application的效果,避免紙質(zhì)單據(jù)中人為造成的錯誤(如數(shù)據(jù)錯誤等)。所以IT系統(tǒng)完善的大公司更喜歡EDI,因為EDI對于業(yè)務(wù)人員是透明的,業(yè)務(wù)人員操作自己日常的業(yè)務(wù)系統(tǒng)就可以了。

EDI依賴于幾個部分:

1、EDI傳輸途徑,一般EDI通過AS2協(xié)議、FTP/S等進(jìn)行直聯(lián),也可以通過第三方的VAN(增值網(wǎng))服務(wù)商中轉(zhuǎn)(這個和我們使用電子郵件的模式相同)。因為涉及到業(yè)務(wù)信息,傳輸安全要求會比較高;

2、EDI標(biāo)準(zhǔn),即業(yè)務(wù)數(shù)據(jù)的組織形式,目前最常用的美標(biāo)的ANSI X12和聯(lián)合國和歐盟的EDIFact,當(dāng)然還有很多其他標(biāo)準(zhǔn),只要EDI雙方遵循同一標(biāo)準(zhǔn),就可以很好的實現(xiàn)EDI交互;

3、兩端的EDI軟件(環(huán)境),一般最好的實現(xiàn)方式是由EDI軟件自動收發(fā)EDI報文(數(shù)據(jù)文件),并自動集成到企業(yè)業(yè)務(wù)系統(tǒng)中。

其中傳輸途徑中,我們采用的是FTP進(jìn)行文件傳輸?shù)?,這里我主要介紹一下Java是如何通過FTP工具進(jìn)行文件的上傳與下載,這里我們的FTP服務(wù)器是Linux操作系統(tǒng)。

二、JAVA架包引用

其中“commons-net-1.4.1.jar”、“jakarta-oro-2.0.8.jar”點擊鏈接均可直接下載,并且確保是可以用的,大家可以放心下載。

三、文件路徑
客戶端需要上傳的文件夾路徑"E:\edi\edi850",默認(rèn)是將該文件夾下所有文件上傳
FTP服務(wù)器端上傳路徑為“/home/test/edi850”,如果上傳為路徑則FTP服務(wù)器會建立對應(yīng)同樣的路徑

四、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; 
  } 
 
  /** 
   * 關(guān)閉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 
   *      遠(yuǎn)程目錄 
   * @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("下載過程中出現(xiàn)異常"); 
      } 
    } else { 
      logger.error("鏈接失敗!"); 
    } 
 
  } 
 
  /** 
   * 
   * 下載FTP文件 當(dāng)你需要下載FTP文件的時候,調(diào)用此方法 根據(jù)<b>獲取的文件名,本地地址,遠(yuǎn)程地址</b>進(jìn)行下載 
   * 
   * @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文件測試,第二個參數(shù)為客戶端下載地址,第三個參數(shù)為文件服務(wù)器下載路徑 
    System.out.println("ok"); 
 
  } 
 
} 

上傳成功后,F(xiàn)TP文件服務(wù)器文件情況如下

下載成功后,客戶端文件如下
打開后,文件內(nèi)容如下
好了,EDI中如何通過FTP工具進(jìn)行文件的上傳與下載先介紹到這里,以上代碼本人均親自測試,可以運行。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于springboot activiti 配置項解析

    基于springboot activiti 配置項解析

    這篇文章主要介紹了springboot activiti 配置項解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SVN 安裝教程之服務(wù)器和客戶端

    SVN 安裝教程之服務(wù)器和客戶端

    這篇文章主要介紹了SVN 安裝教程之服務(wù)器和客戶端的相關(guān)資料,這里對安裝步驟進(jìn)行了詳細(xì)介紹,需要的朋友可以參考下
    2016-11-11
  • Mybatis之a(chǎn)ssociation和collection用法

    Mybatis之a(chǎn)ssociation和collection用法

    這篇文章主要介紹了Mybatis之a(chǎn)ssociation和collection用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java 實現(xiàn)棧的三種方式

    Java 實現(xiàn)棧的三種方式

    這篇文章主要介紹了棧:LIFO(后進(jìn)先出),自己實現(xiàn)一個棧,要求這個棧具有push()、pop()(返回棧頂元素并出棧)、peek() (返回棧頂元素不出棧)、isEmpty()這些基本的方法,需要的朋友可以參考下
    2020-12-12
  • Java抽象類和抽象方法定義與用法實例詳解

    Java抽象類和抽象方法定義與用法實例詳解

    這篇文章主要介紹了Java抽象類和抽象方法定義與用法,結(jié)合實例形式詳細(xì)分析了Java抽象類和抽象方法相關(guān)原理、定義、使用方法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • 淺談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組

    淺談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組

    下面小編就為大家?guī)硪黄獪\談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java并行處理的實現(xiàn)

    Java并行處理的實現(xiàn)

    并行計算一般是指許多指令得以同時進(jìn)行的計算模式。本文主要介紹了Java并行處理的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Springboot如何配置yml文件與映射到j(luò)ava類

    Springboot如何配置yml文件與映射到j(luò)ava類

    這篇文章主要介紹了Springboot如何配置yml文件與映射到j(luò)ava類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring Boot加密配置文件方法介紹

    Spring Boot加密配置文件方法介紹

    這篇文章主要介紹了SpringBoot加密配置文件,近期在對開發(fā)框架安全策略方面進(jìn)行升級優(yōu)化,提供一些通用場景的解決方案,本文針對配置文件加密進(jìn)行簡單的分享
    2023-01-01
  • mybatis插入數(shù)據(jù)后如何返回新增數(shù)據(jù)的id值

    mybatis插入數(shù)據(jù)后如何返回新增數(shù)據(jù)的id值

    當(dāng)往mysql數(shù)據(jù)庫插入一條數(shù)據(jù)時,有時候需要知道剛插入的信息,下面這篇文章主要給大家介紹了關(guān)于mybatis插入數(shù)據(jù)后如何返回新增數(shù)據(jù)id值的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評論