1.依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
2. 工具类
package com.example.demo.util;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.springframework.stereotype.Component;
import java.io.*;
import java.nio.charset.Charset;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
@Component
public class FTPFileProUtils {
private static String hostname = "192.168.xxx.131";
private static int port = 21;
private static String username = "myftp";
private static String password = "myftp";
private static String mInRConnFilePath = "/app/data/20181126/";
private static String mOutRConnFilePath = "/app/data/xml/LP00000001/20181126/";
private FTPClient client;
public void initFtpClient() throws Exception {
client = new FTPClient();
client.setCharset(Charset.forName("UTF-8"));
client.enterLocalPassiveMode();
client.connect(hostname, port);
client.login(username, password);
client.setFileType(FTP.BINARY_FILE_TYPE);
}
public void changeWorkingDirectory(String pathname) {
try {
client.changeWorkingDirectory(pathname);
} catch (IOException e) {
e.printStackTrace();
}
}
public void initFtpClientPara(String hostname, int port, String username, String password) throws Exception {
client = new FTPClient();
client.setCharset(Charset.forName("UTF-8"));
client.enterLocalPassiveMode();
client.connect(hostname, port);
client.login(username, password);
client.setFileType(FTP.BINARY_FILE_TYPE);
}
public void fileUpload(InputStream in, String makeDirectory, String newFileName) {
try {
boolean isChanged = client.changeWorkingDirectory(makeDirectory);
String s = client.printWorkingDirectory();
System.out.println(s);
if (!isChanged) {
if (client.makeDirectory(new String(makeDirectory.getBytes("UTF-8"), "UTF-8"))) {
client.changeWorkingDirectory(makeDirectory);
} else {
}
}
client.enterLocalPassiveMode();
boolean isSuccess = client.storeFile(new String(newFileName.getBytes("UTF-8"), "iso-8859-1"), in);
System.out.println(isSuccess);
} catch (Exception e) {
System.out.println("异常问题 : " + e.getMessage());
System.out.println("-------------文件上传方法结束-------------");
}
}
public ByteArrayInputStream getByteArrayInputStream(String makeDirectory, String fileName) {
ByteArrayInputStream inStream = null;
if (fileName == null || "".equals(fileName)) {
System.out.println("文件名称不能为空");
return null;
}
try {
System.out.println("Ftp客户端对象:client = " + client);
boolean isChangedFlag = true;
if (isChangedFlag) {
client.enterLocalPassiveMode();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
client.retrieveFile(fileName, outStream);
inStream = new ByteArrayInputStream(outStream.toByteArray());
System.out.println("输入流:ByteArrayInputStream:inStream = " + inStream);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作异常:获取文件输入流失败");
}
return inStream;
}
public void changeDir(String path) {
if (path != null && !"".equals(path)) {
try {
client.changeWorkingDirectory(new String(path.getBytes("UTF-8"), "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void makeDir(String makeDirectory) {
try {
boolean isChanged = client.changeWorkingDirectory(makeDirectory);
if (!isChanged) {
if (client.makeDirectory(new String(makeDirectory.getBytes("UTF-8"), "UTF-8"))) {
client.changeWorkingDirectory(makeDirectory);
} else {
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void printWorkDir() {
try {
System.out.println(client.printWorkingDirectory());
} catch (IOException e) {
e.printStackTrace();
}
}
public List<String> getFTPDirSpecifiedFile(String path, String fileName) throws ParseException {
List<String> fileLists = new ArrayList<String>();
FTPFile[] ftpFileList = null;
try {
ftpFileList = client.listFiles(path);
} catch (IOException e) {
e.printStackTrace();
}
if (ftpFileList != null && ftpFileList.length > 0) {
for (int i = 2; i < ftpFileList.length; i++) {
FTPFile file = ftpFileList[i];
if (file.isFile()) {
if (file.getName().equals(fileName)) {
System.out.println("文件夹下面的文件=====:" + file.getName());
fileLists.add(file.getName());
}
}
}
}
return fileLists;
}
public List<String> getFTPCurrentDateDirSpecifiedFile(String path, String fileName) throws ParseException {
List<String> fileLists = new ArrayList<String>();
FTPFile[] ftpFileList = null;
try {
ftpFileList = client.listFiles(path);
} catch (IOException e) {
e.printStackTrace();
}
if (ftpFileList != null && ftpFileList.length > 0) {
System.out.println("ftpFileList.length:" + ftpFileList.length);
for (int i = 0; i < ftpFileList.length; i++) {
FTPFile file = ftpFileList[i];
if (file.isFile()) {
if (file.getName().equals(fileName)) {
System.out.println("文件夹下面的文件=====:" + file.getName());
fileLists.add(file.getName());
}
}
}
}
return fileLists;
}
public List<String> getFTPDirAllFileList(String path) throws ParseException {
List<String> fileLists = new ArrayList<String>();
FTPFile[] ftpFileList = null;
try {
ftpFileList = client.listFiles(path);
} catch (IOException e) {
e.printStackTrace();
}
if (ftpFileList != null && ftpFileList.length > 0) {
for (int i = 2; i < ftpFileList.length; i++) {
FTPFile file = ftpFileList[i];
if (file.isFile()) {
System.out.println("文件夹下面的文件=====:" + file.getName());
fileLists.add(file.getName());
}
}
}
return fileLists;
}
public List<String> getFTPCurrentDateDirAllFileList(String remotePath) throws ParseException {
List<String> fileLists = new ArrayList<String>();
FTPFile[] ftpFileList = null;
try {
ftpFileList = client.listFiles(remotePath);
} catch (IOException e) {
e.printStackTrace();
}
if (ftpFileList != null && ftpFileList.length > 0) {
for (int i = 0; i < ftpFileList.length; i++) {
FTPFile file = ftpFileList[i];
if (file.isFile()) {
System.out.println("文件夹下面的文件=====:" + file.getName());
fileLists.add(file.getName());
}
}
}
return fileLists;
}
public List<String> getFTPDirTypeFileList(String path, String fileType) throws ParseException {
List<String> fileLists = new ArrayList<String>();
FTPFile[] ftpFileList = null;
try {
ftpFileList = client.listFiles(path);
} catch (IOException e) {
e.printStackTrace();
}
if (ftpFileList != null && ftpFileList.length > 0) {
for (int i = 2; i < ftpFileList.length; i++) {
FTPFile file = ftpFileList[i];
if (file.isFile()) {
System.out.println("文件夹下面的文件=====:" + file.getName());
if (file.getName().endsWith(fileType)) {
fileLists.add(file.getName());
}
}
}
}
return fileLists;
}
public List<String> getFTPCurrentDateDirTypeFile(String path, String fileType) throws ParseException {
List<String> fileLists = new ArrayList<String>();
FTPFile[] ftpFileList = null;
try {
ftpFileList = client.listFiles(path);
} catch (IOException e) {
e.printStackTrace();
}
if (ftpFileList != null && ftpFileList.length > 0) {
for (int i = 2; i < ftpFileList.length; i++) {
FTPFile file = ftpFileList[i];
if (file.isFile()) {
System.out.println("文件夹下面的文件=====:" + file.getName());
if (file.getName().endsWith(fileType)) {
fileLists.add(file.getName());
}
}
}
}
return fileLists;
}
public List<String> getFileList2(String path) throws ParseException {
List<String> fileLists = new ArrayList<String>();
FTPFile[] ftpFileList = null;
try {
ftpFileList = client.listFiles(path);
} catch (IOException e) {
e.printStackTrace();
}
if (ftpFileList != null && ftpFileList.length > 0) {
for (int i = 2; i < ftpFileList.length; i++) {
FTPFile file = ftpFileList[i];
if (file.isFile()) {
System.out.println("文件夹下面的文件=====:" + file.getName());
fileLists.add(file.getName());
}
}
}
return fileLists;
}
public void closeClient() {
try {
client.logout();
} catch (IOException e) {
e.printStackTrace();
}
}
public void delDirAllFile(String pathname) {
try {
client.deleteFile(pathname);
} catch (IOException e) {
e.printStackTrace();
}
}
public FTPClient getClient() {
return client;
}
public void setClient(FTPClient client) {
this.client = client;
}
public static String getmInRConnFilePath() {
return mInRConnFilePath;
}
public static void setmInRConnFilePath(String mInRConnFilePath) {
FTPFileProUtils.mInRConnFilePath = mInRConnFilePath;
}
public static String getmOutRConnFilePath() {
return mOutRConnFilePath;
}
public static void setmOutRConnFilePath(String mOutRConnFilePath) {
FTPFileProUtils.mOutRConnFilePath = mOutRConnFilePath;
}
public static String getHostname() {
return hostname;
}
public static void setHostname(String hostname) {
FTPFileProUtils.hostname = hostname;
}
public static int getPort() {
return port;
}
public static void setPort(int port) {
FTPFileProUtils.port = port;
}
public static String getUsername() {
return username;
}
public static void setUsername(String username) {
FTPFileProUtils.username = username;
}
public static String getPassword() {
return password;
}
public static void setPassword(String password) {
FTPFileProUtils.password = password;
}
}
2. 业务处理类
package com.example.demo.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Transactional
public class HttpFTPServiceImpl implements HttpFTPService {
private static Logger log = Logger.getLogger(HttpFTPServiceImpl.class);
private String mUUID;
private String mTransCode = "";
private String mTransType = "";
private String mFileName = "";
private String mSouFilePath = "";
private String mDesFilePath = "";
private String jsonString = "";
private JSONObject jsonObject = null;
private int mUploadallnum = 0;
private int mFilesuccnum = 0;
private int mFilefailnum = 0;
private Date tStartDate = null;
private Date tEndDate = null;
private String mINRConnIP = "192.168.xxx.145";
private int mInRConnPort=21;
private String mInRConnUser = "username";
private String mInRConnPWD = "passwd";
private String mOutRConnIP = "";
private int mOutRConnPort;
private String mOutRConnUser = "";
private String mOutRConnPWD = "";
FTPFileProUtils ftpOut = new FTPFileProUtils();
FTPFileProUtils ftpIn = new FTPFileProUtils();
Map<String, Object> map = new HashMap<String, Object>();
@Autowired
HttpServletRequest httpRequest;
@Autowired
private FisftpinoutparainfoMapper fisftpinoutparainfoMapper;
Fisftpcallingtrace mFisftpcallingtrace = new Fisftpcallingtrace();
@Override
public String commonRequests(HttpServletRequest paramRequest, HttpServletResponse paramResponse,
String paramRequestBody) throws Exception {
log.info("Receive HttpRequest:!!!");
try {
jsonObject = JSONObject.parseObject(paramRequestBody);
} catch (Exception e) {
log.info("Request parameter format error, parse exception");
jsonString = requestErrorDeal();
return jsonString;
}
mTransCode = jsonObject.getString("TransCode");
mTransType = jsonObject.getString("TransType");
mSouFilePath = jsonObject.getString("SouFilePath");
mDesFilePath = jsonObject.getString("DesFilePath");
mFileName = jsonObject.getString("FileName");
log.info("业务类型mTransCode:" + mTransCode);
log.info("交易方式mTransType:" + mTransType);
log.info("源路径mSouFilePath:" + mSouFilePath);
log.info("目标路径mDesFilePath:" + mDesFilePath);
log.info("文件名mFileName:" + mFileName);
if (mTransType.equals("1") && mTransType != null) {
getFTPInOutPara(mTransCode);
remoteReadWriteCurrentDateDirAllFile();
mFisftpcallingtrace.setTranstype("1");
} else if (mTransType.equals("0") && mTransType != null) {
getFTPInOutPara(mTransCode);
remoteReadWriteCurrentDateDirAppointFile();
mFisftpcallingtrace.setTranstype("0");
} else {
log.info("This business type is not supported!!!:");
}
log.info("fis执行处理完毕!!!:");
return jsonString;
}
private String remoteReadWriteCurrentDateDirAllFile() {
try {
connectingCommon();
List<String> fileNames = ftpOut.getFTPCurrentDateDirAllFileList(mSouFilePath);
if (fileNames.size() == 0) {
jsonString = mSouFilePathErrorDeal();
return jsonString;
}
log.info("fileNames.length : " + fileNames.size());
mUploadallnum = fileNames.size();
mFisftpcallingtrace.setUploadallnum(String.valueOf(mUploadallnum));
if (fileNames != null) {
for (String fileName : fileNames) {
log.info("File name under directory : " + fileName);
InputStream in = ftpOut.getByteArrayInputStream(mSouFilePath, fileName);
tStartDate = new Date();
ftpIn.fileUpload(in, mDesFilePath, fileName);
tEndDate = new Date();
}
}
commonVariablesInTrajectory(mDesFilePath);
ResponseSuccRecordTrajectory(tStartDate, tEndDate);
} catch (Exception e) {
log.info("文件批量传输异常!!!");
jsonString = FileTransferExceptionDeal(mUploadallnum, mFilesuccnum, mFilefailnum);
return jsonString;
} finally {
ftpIn.closeClient();
ftpOut.closeClient();
}
return jsonString;
}
private String remoteReadWriteCurrentDateDirAppointFile() {
try {
connectingCommon();
List<String> fileNames = ftpOut.getFTPCurrentDateDirSpecifiedFile(mSouFilePath, mFileName);
if (fileNames.size() == 0) {
jsonString = mSouFilePathErrorDeal();
return jsonString;
}
log.info("fileNames.length : " + fileNames.size());
mUploadallnum = fileNames.size();
mFisftpcallingtrace.setUploadallnum(String.valueOf(mUploadallnum));
if (fileNames != null) {
for (String fileName : fileNames) {
log.info("File name under directory : " + fileName);
InputStream in = ftpOut.getByteArrayInputStream(mSouFilePath, fileName);
tStartDate = new Date();
ftpIn.fileUpload(in, mDesFilePath, fileName);
tEndDate = new Date();
}
}
commonVariablesInTrajectory(mDesFilePath);
ResponseSuccRecordTrajectory(tStartDate, tEndDate);
} catch (Exception e) {
log.info("文件单笔读写出现异常");
jsonString = FileTransferExceptionDeal(mUploadallnum, mFilesuccnum, mFilefailnum);
return jsonString;
} finally {
ftpIn.closeClient();
ftpOut.closeClient();
}
return jsonString;
}
private String ResponseSuccRecordTrajectory(Date tStartDate, Date tEndDate) {
SuccessTrajectoryCommonVariable(tStartDate, tEndDate);
map.put("ResultCode", "0");
map.put("ResultMsg", "处理成功");
jsonObject = JSONObject.parseObject(JSON.toJSONString(map));
jsonString = JSON.toJSONString(jsonObject);
return jsonString;
}
private void SuccessTrajectoryCommonVariable(Date tStartDate, Date tEndDate) {
mUUID = (String) httpRequest.getAttribute(TraceEntity.Trace_UUID);
mFisftpcallingtrace.setTraceid(mUUID);
mFisftpcallingtrace.setServicename("File transfer platform");
mFisftpcallingtrace.setTranscode(mTransCode);
mFisftpcallingtrace.setServicetype(TraceEntity.Trace_HttpType);
mFisftpcallingtrace.setTranstype(mTransType);
mFisftpcallingtrace.setReqip(httpRequest.getLocalAddr());
mFilefailnum = mUploadallnum - mFilesuccnum;
mFisftpcallingtrace.setFilefailnum(String.valueOf(mFilefailnum));
mFisftpcallingtrace.setReqstatus("1");
mFisftpcallingtrace.setReqdate(DateUtil.getyyyyMMddDate(tStartDate));
mFisftpcallingtrace.setReqtime(DateUtil.getTimeFormat(tStartDate));
mFisftpcallingtrace.setHandledate(DateUtil.getyyyyMMddDate(tEndDate));
mFisftpcallingtrace.setHandletime(DateUtil.getTimeFormat(tEndDate));
httpRequest.setAttribute("FTPTrace", mFisftpcallingtrace);
}
private void getFTPInOutPara(String mTransCode) {
Fisftpinoutparainfo ftpInOutParaInfo = fisftpinoutparainfoMapper.selectByPrimaryKey(mTransCode);
mINRConnIP = ftpInOutParaInfo.getFtpinrconnip();
mInRConnPort = ftpInOutParaInfo.getFtpinrconnport();
mInRConnUser = ftpInOutParaInfo.getFtpinrconnuser();
mInRConnPWD = ftpInOutParaInfo.getFtpinrconnpwd();
mOutRConnIP = ftpInOutParaInfo.getFtpoutrconnip();
mOutRConnPort = ftpInOutParaInfo.getFtpoutrconnport();
mOutRConnUser = ftpInOutParaInfo.getFtpoutrconnuser();
mOutRConnPWD = ftpInOutParaInfo.getFtpoutrconnpwd();
}
private void connectingCommon() throws Exception {
ftpOut.initFtpClientPara(mOutRConnIP, mOutRConnPort, mOutRConnUser, mOutRConnPWD);
ftpIn.initFtpClientPara(mINRConnIP, mInRConnPort, mInRConnUser, mInRConnPWD);
ftpOut.printWorkDir();
ftpIn.printWorkDir();
ftpOut.changeDir(mSouFilePath);
ftpIn.changeDir(mDesFilePath);
ftpOut.printWorkDir();
ftpIn.printWorkDir();
}
public void commonVariablesInTrajectory(String mDesFilePath) {
List<String> ftpInDirAllFileList;
try {
ftpInDirAllFileList = ftpIn.getFTPCurrentDateDirAllFileList(mDesFilePath);
mFilesuccnum = ftpInDirAllFileList.size();
mFisftpcallingtrace.setFilesuccnum(String.valueOf(mFilesuccnum));
mFisftpcallingtrace.setResstatus("0");
mFisftpcallingtrace.setResremark("文件上传成功");
} catch (ParseException e) {
e.printStackTrace();
}
}
private String requestErrorDeal() {
map.put("ResultCode", "1");
map.put("ResultMsg", "请求参数格式不符合规约要求,请核实!!!");
jsonObject = JSONObject.parseObject(JSON.toJSONString(map));
jsonString = JSON.toJSONString(jsonObject);
return jsonString;
}
private String mSouFilePathErrorDeal() {
map.put("ResultCode", "1");
map.put("ResultMsg", "原路径中无符合条件的文件,请核实文件是否存在!!!");
jsonObject = JSONObject.parseObject(JSON.toJSONString(map));
jsonString = JSON.toJSONString(jsonObject);
return jsonString;
}
private String FileTransferExceptionDeal(int mUploadallnum, int mFilesuccnum, int mFilefailnum) {
tStartDate = new Date();
tEndDate = new Date();
FileReadAndWriteExceptionTrajectoryRecord(tStartDate, tEndDate, mUploadallnum, mFilesuccnum, mFilefailnum);
map.put("ResultCode", "1");
map.put("ResultMsg", "由于文件格式不符合规约要求,文件读写异常,请检查文件格式!!!");
jsonObject = JSONObject.parseObject(JSON.toJSONString(map));
jsonString = JSON.toJSONString(jsonObject);
return jsonString;
}
private void FileReadAndWriteExceptionTrajectoryRecord(Date tStartDate, Date tEndDate, int mUploadallnum,
int mFilesuccnum, int mFilefailnum) {
mFisftpcallingtrace.setResremark("文件格式格式不符合规约要求,请核实!!!");
CommonVariablesOfAbnormalTrajectories(tStartDate, tEndDate, mUploadallnum, mFilesuccnum, mFilefailnum);
}
private void CommonVariablesOfAbnormalTrajectories(Date tStartDate, Date tEndDate, int mUploadallnum,
int mFilesuccnum, int mFilefailnum) {
mUUID = (String) httpRequest.getAttribute(TraceEntity.Trace_UUID);
mFisftpcallingtrace.setTraceid(mUUID);
mFisftpcallingtrace.setServicename("File transfer platform");
mFisftpcallingtrace.setServicetype(TraceEntity.Trace_HttpType);
mFisftpcallingtrace.setReqip(httpRequest.getLocalAddr());
mFisftpcallingtrace.setTranscode(mTransCode);
mFisftpcallingtrace.setTranstype(mTransType);
mFisftpcallingtrace.setUploadallnum(String.valueOf(mUploadallnum));
mFilefailnum = mUploadallnum - mFilesuccnum;
mFisftpcallingtrace.setFilesuccnum(String.valueOf(mFilesuccnum));
mFisftpcallingtrace.setFilefailnum(String.valueOf(mFilefailnum));
mFisftpcallingtrace.setReqstatus("1");
mFisftpcallingtrace.setResstatus("1");
mFisftpcallingtrace.setReqdate(DateUtil.getyyyyMMddDate(tStartDate));
mFisftpcallingtrace.setReqtime(DateUtil.getTimeFormat(tStartDate));
mFisftpcallingtrace.setHandledate(DateUtil.getyyyyMMddDate(tEndDate));
mFisftpcallingtrace.setHandletime(DateUtil.getTimeFormat(tEndDate));
httpRequest.setAttribute("FTPTrace", mFisftpcallingtrace);
}
}