From f429658e8bf3c88c4550171f61d6984033940b54 Mon Sep 17 00:00:00 2001
From: wanghc <2466022993@qq.com>
Date: Thu, 09 Mar 2023 09:22:47 +0800
Subject: [PATCH] 浦发分行系统文件上传
---
cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java | 50 ++++++++
cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java | 29 ++++
cmci-pfcs-gateway/pom.xml | 6 +
cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java | 10 +
cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java | 115 +++++++++++++++++++
cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java | 21 ++
cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java | 106 +++++++++++++++++
cmci-pfcs-gateway/src/main/resources/application.properties | 6
cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java | 4
9 files changed, 337 insertions(+), 10 deletions(-)
diff --git a/cmci-pfcs-gateway/pom.xml b/cmci-pfcs-gateway/pom.xml
index df13059..e57d545 100644
--- a/cmci-pfcs-gateway/pom.xml
+++ b/cmci-pfcs-gateway/pom.xml
@@ -49,6 +49,12 @@
<artifactId>okhttp</artifactId>
<version>3.3.1</version>
</dependency>
+ <!-- jcraft sftp -->
+ <dependency>
+ <groupId>com.jcraft</groupId>
+ <artifactId>jsch</artifactId>
+ <version>0.1.53</version>
+ </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java
new file mode 100644
index 0000000..d17692b
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/conf/GlobalExceptionHandler.java
@@ -0,0 +1,29 @@
+package com.jttech.pfcs.conf;
+
+import com.jttech.pfcs.vo.resp.ResponseVo;
+import org.slf4j.Logger;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 全域异常处理
+ * @author wanghc
+ * @version 1.0.0
+ * @date 2023-03-09
+ */
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+ @ResponseBody
+ @ExceptionHandler(Exception.class)
+ public ResponseVo exceptionHandler(HttpServletRequest request, Exception exception) {
+ String errMsg = StringUtils.isEmpty(exception.getMessage()) ? "服务异常" : exception.getMessage();
+ //截取前面20个字符
+ errMsg = errMsg.substring(0,Math.min(20, errMsg.length()));
+ return ResponseVo.fail(-999, errMsg);
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java
index 18d4beb..c061e2d 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/controller/BillController.java
@@ -2,15 +2,14 @@
import com.jttech.pfcs.services.IBillService;
import com.jttech.pfcs.vo.req.bill.BillApiReqVo;
+import com.jttech.pfcs.vo.req.bill.FtpServerParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import com.jttech.pfcs.vo.resp.ResponseVo;
+import org.springframework.web.multipart.MultipartFile;
/**
* 账单
@@ -34,7 +33,19 @@
return mBillService.post(reqVo);
} finally {
final long endTime = System.currentTimeMillis();
- mLogger.info("Execute heart the result is {} time spent is {} ", result, (endTime - beginTime));
+ mLogger.info("Execute post the result is {} time spent is {} ", result, (endTime - beginTime));
+ }
+ }
+
+ @RequestMapping(value = "/fileUpload")
+ public ResponseVo fileUpload(MultipartFile[] files, FtpServerParam ftpServer) {
+ final long beginTime = System.currentTimeMillis();
+ ResponseVo result = new ResponseVo();
+ try {
+ return mBillService.fileUpload(files, ftpServer);
+ } finally {
+ final long endTime = System.currentTimeMillis();
+ mLogger.info("Execute fileUpload the result is {} time spent is {} ", result, (endTime - beginTime));
}
}
}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java
index cbbfb48..3a6715d 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/IBillService.java
@@ -1,7 +1,9 @@
package com.jttech.pfcs.services;
+import com.jttech.pfcs.vo.req.bill.FtpServerParam;
import com.jttech.pfcs.vo.resp.ResponseVo;
import com.jttech.pfcs.vo.req.bill.BillApiReqVo;
+import org.springframework.web.multipart.MultipartFile;
/**
* @author wanghc
@@ -16,4 +18,12 @@
* @return
*/
ResponseVo post(BillApiReqVo reqVo);
+
+ /**
+ * 文件上传
+ * @param files
+ * @param pFtpServerParam
+ * @return
+ */
+ ResponseVo fileUpload(MultipartFile[] files, FtpServerParam pFtpServerParam);
}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java
index 79d9963..d68cff3 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/services/impl/BillServiceImpl.java
@@ -1,9 +1,15 @@
package com.jttech.pfcs.services.impl;
+import java.io.File;
import java.util.concurrent.TimeUnit;
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.Session;
+import com.jttech.pfcs.util.SftpUtil;
+import com.jttech.pfcs.vo.req.bill.FtpServerParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSONObject;
@@ -13,6 +19,7 @@
import com.jttech.pfcs.vo.resp.bill.BillApiRespVo;
import okhttp3.*;
+import org.springframework.web.multipart.MultipartFile;
/**
* 账单服务
@@ -62,4 +69,47 @@
return ResponseVo.fail(-999, errMsg);
}
}
+
+ /**
+ * 文件上传
+ *
+ * @param files
+ * @param ftpServer
+ * @return
+ */
+ @Override
+ public ResponseVo fileUpload(MultipartFile[] files, FtpServerParam ftpServer) {
+ Session session = null;
+ ChannelSftp sftpChannel = null;
+ try {
+ session = SftpUtil.getSession(ftpServer.getIp(), ftpServer.getUser(), ftpServer.getPwd(), ftpServer.getPort());
+ sftpChannel = SftpUtil.openChannel(session);
+ //文件目录没有就需要创建
+ String saveDirPath = ftpServer.getSaveDirPath();
+ File targetDirFile = new File(saveDirPath);
+ if (!targetDirFile.exists()) {
+ if (!targetDirFile.mkdirs()) {
+ // 创建处理目录失败
+ throw new Exception("创建文件目录失败");
+ }
+ }
+ SftpUtil.cd(sftpChannel, saveDirPath);
+ for (MultipartFile file : files) {
+ String fileName = file.getOriginalFilename();
+ //放入文件
+ SftpUtil.put(sftpChannel, file.getBytes(), fileName);
+ }
+ } catch (Exception e) {
+ mLogger.error("BillServiceImpl.fileUpload err={} server={}", e, ftpServer);
+ throw new RuntimeException(e.getMessage());
+ } finally {
+ if (null != sftpChannel) {
+ sftpChannel.disconnect();
+ }
+ if (null != session) {
+ session.disconnect();
+ }
+ }
+ return ResponseVo.ok();
+ }
}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java
new file mode 100644
index 0000000..0e980f7
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/util/SftpUtil.java
@@ -0,0 +1,115 @@
+package com.jttech.pfcs.util;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.Session;
+import com.jcraft.jsch.SftpException;
+
+/**
+ * sftp
+ *
+ * @author: yan xu
+ * @version: 1.0, 2017年12月21日
+ */
+public class SftpUtil {
+
+ public static Session getSession(String pIp, String pUser, String pPsw, int pPort) throws Exception {
+ Session session = null;
+ JSch jsch = new JSch();
+ if (pPort <= 0) {
+ // 连接服务器,采用默认端口
+ session = jsch.getSession(pUser, pIp);
+ } else {
+ // 采用指定的端口连接服务器
+ session = jsch.getSession(pUser, pIp, pPort);
+ }
+ // 设置登陆主机的密码
+ session.setPassword(pPsw);// 设置密码
+ // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
+ session.setConfig("StrictHostKeyChecking", "no");
+ // 设置登陆超时时间
+ session.connect(300000);
+ return session;
+ }
+
+
+
+ public static ChannelSftp openChannel(Session pSession) throws Exception {
+ ChannelSftp channel = (ChannelSftp) pSession.openChannel("sftp");
+ channel.connect(10000000);
+ return channel;
+ }
+
+
+
+ public static void cd(ChannelSftp pSftp, String pPath) throws Exception {
+ String[] folders = pPath.split("/");
+ boolean isFirst = true;
+ for (int i = 0; i < folders.length; i++) {
+ String folder = folders[i];
+ if (folder == null || folder.length() == 0) {
+ continue;
+ }
+ if (isFirst) {
+ folder = "/" + folder;
+ isFirst = false;
+ }
+ try {
+ pSftp.cd(folder);
+ } catch (SftpException e) {
+ pSftp.mkdir(folder);
+ pSftp.cd(folder);
+ }
+ }
+ }
+
+
+ public static void put(ChannelSftp pSftp, byte[] pFileBytes, String pPath) throws Exception {
+ InputStream inputs = new ByteArrayInputStream(pFileBytes);
+ pSftp.put(inputs, pPath);
+ }
+
+ public static void put(ChannelSftp pSftp, File pFile, String pPath) throws Exception {
+ FileInputStream inputStream = new FileInputStream(pFile);
+ try {
+ pSftp.put(inputStream, pPath);
+ } finally {
+ inputStream.close();
+ }
+ }
+
+
+
+ public static void get(ChannelSftp pSftp, String pDownloadFile, String pSaveDirectory) throws Exception {
+ File dir = new File(pSaveDirectory);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ String saveFile = pSaveDirectory + "/" + pDownloadFile;
+ File file = new File(saveFile);
+ FileOutputStream fileOutputStream = new FileOutputStream(file);
+ pSftp.get(pDownloadFile, fileOutputStream);
+ fileOutputStream.close();
+ }
+
+
+
+ public static List<String> listFiles(ChannelSftp pSftp, String pPath) throws Exception {
+ List<String> result = new ArrayList<>();
+ Vector ls = pSftp.ls(pPath);
+ if (null != ls && ls.size() > 0) {
+ for (Object l : ls) {
+ ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry) l;
+ String filename = lsEntry.getFilename();
+ result.add(filename);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java
new file mode 100644
index 0000000..e98a518
--- /dev/null
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/req/bill/FtpServerParam.java
@@ -0,0 +1,106 @@
+package com.jttech.pfcs.vo.req.bill;
+
+import java.io.Serializable;
+
+/**
+ * ftp服务参数
+ *
+ * @author wanghc
+ * @version 1.0.0
+ * @date 2023-03-09
+ */
+public class FtpServerParam implements Serializable {
+
+ private static final long serialVersionUID = 9215027608162929560L;
+
+ /**
+ * ip
+ */
+ private String ip;
+
+ /**
+ * 端口
+ */
+ private Integer port;
+
+ /**
+ * 登录用户
+ */
+ private String user;
+
+ /**
+ * 登录密码
+ */
+ private String pwd;
+
+ /**
+ * 保存路径
+ */
+ private String saveDirPath;
+
+ public String getIp() {
+ return ip;
+ }
+
+
+
+ public void setIp(String pIp) {
+ ip = pIp;
+ }
+
+
+
+ public Integer getPort() {
+ return port;
+ }
+
+
+
+ public void setPort(Integer pPort) {
+ port = pPort;
+ }
+
+
+
+ public String getUser() {
+ return user;
+ }
+
+
+
+ public void setUser(String pUser) {
+ user = pUser;
+ }
+
+
+
+ public String getPwd() {
+ return pwd;
+ }
+
+
+
+ public void setPwd(String pPwd) {
+ pwd = pPwd;
+ }
+
+
+
+ public String getSaveDirPath() {
+ return saveDirPath;
+ }
+
+
+
+ public void setSaveDirPath(String pSaveDirPath) {
+ saveDirPath = pSaveDirPath;
+ }
+
+
+
+ @Override
+ public String toString() {
+ return "FtpServerParam{" + "ip='" + ip + '\'' + ", port=" + port + ", user='" + user + '\'' + ", pwd='" + pwd
+ + '\'' + ", saveDirPath='" + saveDirPath + '\'' + '}';
+ }
+}
diff --git a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java
index 2ddf3d4..43cea10 100644
--- a/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java
+++ b/cmci-pfcs-gateway/src/main/java/com/jttech/pfcs/vo/resp/ResponseVo.java
@@ -28,6 +28,10 @@
return new ResponseVo(body);
}
+ public static ResponseVo ok() {
+ return new ResponseVo();
+ }
+
public static ResponseVo fail(int errorCode, String errMsg) {
return new ResponseVo(errorCode, errMsg, null);
}
diff --git a/cmci-pfcs-gateway/src/main/resources/application.properties b/cmci-pfcs-gateway/src/main/resources/application.properties
index b88b070..c255588 100644
--- a/cmci-pfcs-gateway/src/main/resources/application.properties
+++ b/cmci-pfcs-gateway/src/main/resources/application.properties
@@ -1,8 +1,4 @@
spring.application.name=@pom.artifactId@
server.port=8400
server.servlet.context-path=/pf-api
-logging.config=classpath:logback.xml
-
-#### pf ������api ############
-pf.bill.trade.flow.qry.url=http://www.baidu.com
-pf.bill.file.notice.url=http://www.baidu.com
\ No newline at end of file
+logging.config=classpath:logback.xml
\ No newline at end of file
--
Gitblit v1.8.0