EDI中JAVA通過FTP工具實(shí)現(xiàn)文件上傳下載實(shí)例
最近接手一個(gè)EDI項(xiàng)目,收獲頗多。其實(shí)我在第一家公司是接觸過EDI的,當(dāng)初我們用EDI主要實(shí)現(xiàn)了訂單數(shù)據(jù)傳輸,客戶向我們下達(dá)采購訂單,通過VPN及FTP工具將采購訂單以約定的報(bào)文形式放到指定的文件服務(wù)器中,然后我們EDI系統(tǒng)會定時(shí)去文件服務(wù)器中獲取報(bào)文,最后解析并生成我們的銷售訂單。這些年過去了,我仍記著當(dāng)初用的最多的是EDI850、EDI855。
一、首先介紹一下EDI的概念
Electronic data interchange,電子數(shù)據(jù)交換。
EDI其實(shí)就是把原來紙質(zhì)的訂單/發(fā)貨通知等業(yè)務(wù)單據(jù),從傳真/快遞等傳統(tǒng)方式,變成在線的電子數(shù)據(jù)方式進(jìn)行交互,從而提高業(yè)務(wù)效率。同時(shí),通過一些EDI軟件的實(shí)施配置,往往可以直接從企業(yè)的業(yè)務(wù)系統(tǒng)生成出相應(yīng)的單據(jù)數(shù)據(jù),并自動傳送至客戶/供應(yīng)商處,實(shí)現(xiàn)Application to Application的效果,避免紙質(zhì)單據(jù)中人為造成的錯誤(如數(shù)據(jù)錯誤等)。所以IT系統(tǒng)完善的大公司更喜歡EDI,因?yàn)镋DI對于業(yè)務(wù)人員是透明的,業(yè)務(wù)人員操作自己日常的業(yè)務(wù)系統(tǒng)就可以了。
EDI依賴于幾個(gè)部分:
1、EDI傳輸途徑,一般EDI通過AS2協(xié)議、FTP/S等進(jìn)行直聯(lián),也可以通過第三方的VAN(增值網(wǎng))服務(wù)商中轉(zhuǎn)(這個(gè)和我們使用電子郵件的模式相同)。因?yàn)樯婕暗綐I(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),就可以很好的實(shí)現(xiàn)EDI交互;
3、兩端的EDI軟件(環(huán)境),一般最好的實(shí)現(xiàn)方式是由EDI軟件自動收發(fā)EDI報(bào)文(數(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”點(diǎn)擊鏈接均可直接下載,并且確保是可以用的,大家可以放心下載。
三、文件路徑
客戶端需要上傳的文件夾路徑"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文件的時(shí)候,調(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文件測試,第二個(gè)參數(shù)為客戶端下載地址,第三個(gè)參數(shù)為文件服務(wù)器下載路徑
System.out.println("ok");
}
}
上傳成功后,F(xiàn)TP文件服務(wù)器文件情況如下
下載成功后,客戶端文件如下
打開后,文件內(nèi)容如下
好了,EDI中如何通過FTP工具進(jìn)行文件的上傳與下載先介紹到這里,以上代碼本人均親自測試,可以運(yùn)行。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡單聊一聊Java線程池ThreadPoolExecutor
在使用線程池之后,開啟線程就變成了在線程池當(dāng)中找到一個(gè)空閑的線程,銷毀線程變成了歸還線程到線程池的過程,下面這篇文章主要給大家介紹了關(guān)于Java線程池ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考下2022-06-06
一文帶你深入了解Java中延時(shí)任務(wù)的實(shí)現(xiàn)
延時(shí)任務(wù)相信大家都不陌生,在現(xiàn)實(shí)的業(yè)務(wù)中應(yīng)用場景可以說是比比皆是。這篇文章主要為大家介紹幾種實(shí)現(xiàn)延時(shí)任務(wù)的辦法,感興趣的可以了解一下2022-11-11

