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)文章
Mybatis之a(chǎn)ssociation和collection用法
這篇文章主要介紹了Mybatis之a(chǎn)ssociation和collection用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02淺談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組
下面小編就為大家?guī)硪黄獪\談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Springboot如何配置yml文件與映射到j(luò)ava類
這篇文章主要介紹了Springboot如何配置yml文件與映射到j(luò)ava類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09mybatis插入數(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