From eed72349910ec181532e5f7ce13677788a769d21 Mon Sep 17 00:00:00 2001
From: shenyijian <1178253012@qq.com>
Date: Mon, 02 Dec 2024 17:40:57 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/jtdev' into jtdev

---
 skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileHandler.java |  325 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 325 insertions(+), 0 deletions(-)

diff --git a/skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileHandler.java b/skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileHandler.java
new file mode 100644
index 0000000..32f5896
--- /dev/null
+++ b/skjcmanager/skjcmanager-service/skjcmanager-by/src/main/java/cn/gistack/by/nettyUpload/HttpUploadFileHandler.java
@@ -0,0 +1,325 @@
+package cn.gistack.by.nettyUpload;
+
+
+import cn.gistack.by.nettyUpload.config.NettyHttpConfig;
+import cn.gistack.by.nettyUpload.utils.BeenUtils;
+import cn.gistack.by.nettyUpload.utils.HttpResponseUtils;
+import cn.gistack.by.nettyUpload.utils.UriUtils;
+import cn.gistack.by.nettyUpload.utils.ExceptionUtils;
+import cn.gistack.by.picUpload.entity.BaiyiPicEntity;
+import cn.gistack.by.picUpload.entity.XfByPic;
+import cn.gistack.by.picUpload.service.BaiyiPicService;
+import cn.gistack.resource.feign.IOssClient;
+import cn.hutool.core.date.DateUtil;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import io.netty.handler.codec.http.*;
+import io.netty.handler.codec.http.multipart.*;
+import io.netty.util.CharsetUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.*;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
+
+
+
+import static cn.gistack.by.nettyUpload.utils.ExceptionUtils.getStackString;
+
+/**
+ * 文件上传处理类
+ * @author chenhaijian
+ * @date 2020-05-21 14:45
+ */
+@Slf4j
+public class  HttpUploadFileHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
+
+    // http请求中可选参数
+    private static final String FILENAME_PARAM = "filename";
+    // http请求中必选的参数
+    private static final String FILE_EXTNAME_PARAM = "fileextname";
+
+
+	private static final String UPLOAD_DATA_URL = "/termite/syncDeviceState";
+	private static final String UPLOAD_FILE_URL = "/termite/termiteDataup";
+    private NettyHttpConfig nettyHttpConfig;
+
+	private BaiyiPicService baiyiPicService;
+
+	/**
+	 * 对象存储构建类
+	 */
+
+	private   IOssClient iOssClient;
+
+    static {
+        // should delete file on exit (in normal exit)
+        DiskFileUpload.deleteOnExitTemporaryFile = true;
+        DiskFileUpload.baseDirectory = null; // system temp directory
+        DiskAttribute.deleteOnExitTemporaryFile = true; // should delete file on
+        // exit (in normal exit)
+        DiskAttribute.baseDirectory = null; // system temp directory
+
+
+    }
+
+    public HttpUploadFileHandler(NettyHttpConfig nettyHttpConfig, IOssClient iOssClient,BaiyiPicService baiyiPicService) {
+		this.nettyHttpConfig = nettyHttpConfig;
+		this.iOssClient = iOssClient;
+		this.baiyiPicService = baiyiPicService;
+
+    }
+
+
+    protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest fullRequest) throws Exception {
+		// Authorization验证
+		boolean isRequestValid = isValidHttpRequest(ctx, fullRequest);
+		if (!isRequestValid) {
+			HttpResponseUtils.sendResponseJson2(ctx, HttpResponseStatus.BAD_REQUEST, "验证失败",null);
+			return ;
+		}
+		// 请求路径验证
+		String urlyz = urlyz(ctx, fullRequest);
+		if (UPLOAD_FILE_URL.equals(urlyz)) { //传图片
+			HttpPostMultipartRequestDecoder test = new HttpPostMultipartRequestDecoder(fullRequest);
+			List<InterfaceHttpData> bodyHttpDatas = test.getBodyHttpDatas();
+			XfByPic xfByPic = new XfByPic();
+
+			for (InterfaceHttpData item : bodyHttpDatas ) {
+				if ( item instanceof Attribute){
+					Attribute attribute = (Attribute)item;
+					System.out.println("getName:::"+attribute.getName());
+					System.out.println("getValue:::"+attribute.getValue());
+					String value = attribute.getValue();
+					switch(attribute.getName()){
+						case "mnNo":
+							xfByPic.setMnNo(value);
+							break;
+						case "order":
+
+							xfByPic.setOrder(value);
+							break;
+						case "sn":
+							xfByPic.setSn(value);
+							break;
+						case "ap":
+							xfByPic.setAp(value);
+							break;
+						case "camera":
+							xfByPic.setCamera(value);
+							break;
+						case "hardware":
+							xfByPic.setHardware(value);
+							break;
+						case "rssi":
+							xfByPic.setRssi(value);
+							break;
+						case "software":
+							xfByPic.setSoftware(value);
+							break;
+						case "temperature":
+							xfByPic.setTemperature(value);
+							break;
+						case "voltage":
+							xfByPic.setVoltage(value);
+							break;
+					}
+
+
+				} else if (item instanceof FileUpload) {
+
+					FileUpload file = (FileUpload)item;
+					String filename = file.getFilename();
+
+					ByteArrayInputStream stream = new ByteArrayInputStream(ByteBufUtil.getBytes(file.getByteBuf()));
+					MockMultipartFile multipartFile
+						= new MockMultipartFile("11", filename, "application/octet-stream", stream);
+
+					String picurl = iOssClient.uploadFile(filename, multipartFile);
+					log.info("图片上传地址::"+picurl);
+					xfByPic.setImageurl(picurl);
+				}
+			}
+			xfByPic.setCreatedAt(new Date());
+			// 保存入库xfByPic
+			baiyiPicService.inserXfPicUrl(xfByPic);
+
+
+
+		} else if(UPLOAD_DATA_URL.equals(urlyz)) { //传数据
+			HttpPostMultipartRequestDecoder test = new HttpPostMultipartRequestDecoder(fullRequest);
+			List<InterfaceHttpData> bodyHttpDatas = test.getBodyHttpDatas();
+			for (InterfaceHttpData item : bodyHttpDatas ) {
+				if (  item instanceof Attribute){
+//					FileUpload file = (FileUpload)item;
+//					String filename = file.getFilename();
+//					ByteArrayInputStream stream = new ByteArrayInputStream(ByteBufUtil.getBytes(file.getByteBuf()));
+//					MockMultipartFile multipartFile
+//						= new MockMultipartFile("11", filename, "application/octet-stream", stream);
+//					String picurl = iOssClient.uploadFile(filename, multipartFile);
+//					log.info("图片上传地址::"+picurl);
+
+				} else if (item instanceof FileUpload) {
+					System.out.println("Attribute:::"+item.getName());
+
+
+				}
+			}
+
+		} else {
+			HttpResponseUtils.sendResponseJson2(ctx, HttpResponseStatus.BAD_REQUEST, "验证失败",null);
+			return ;
+		}
+
+		HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.OK, "上传成功");
+    }
+
+	// 请求路径验证
+	public  String  urlyz(ChannelHandlerContext ctx, FullHttpRequest request) {
+		try {
+
+			URI uri = UriUtils.getURI(request);
+			System.err.println("uri.getPath()::::"+uri.getPath());
+			System.err.println(""+uri.getPath());
+
+			if (uri.getPath().startsWith(UPLOAD_DATA_URL)) {
+				return UPLOAD_DATA_URL;
+			} else if (uri.getPath().startsWith(UPLOAD_FILE_URL)) {
+				return UPLOAD_FILE_URL;
+			}
+		} catch (Exception exception) {
+			exception.printStackTrace();
+			log.error(getStackString(exception));
+			return null;
+		}
+		return null;
+	}
+
+
+
+	public static MultipartFile convert(File file) throws IOException {
+
+		FileInputStream input = new FileInputStream(file);
+		MultipartFile multipartFile = new MockMultipartFile("file",
+			file.getName(), "application/octet-stream", input);
+
+		return multipartFile;
+	}
+
+    private String parseFilePath(FullHttpRequest fullRequest) throws URISyntaxException {
+        String dirPath = this.nettyHttpConfig.getFileSaveRootPath();
+        String fileName = this.parseFileName(fullRequest);
+
+        return dirPath +  File.separator + fileName;
+    }
+
+    private RandomAccessFile getSaveFile(String filePath) {
+        try {
+            RandomAccessFile file = new RandomAccessFile(filePath, "rw");
+            return file;
+        } catch (Exception exception) {
+            log.error(getStackString(exception));
+            return null;
+        }
+    }
+
+    private boolean isValidHttpRequest(ChannelHandlerContext ctx, FullHttpRequest request) {
+        try {
+            URI uri = UriUtils.getURI(request);
+//            log.info(uri.getPath());
+			// authorization效验
+			String authorization = request.headers().get("Authorization");
+			if(!this.nettyHttpConfig.getAuthorization().equals(authorization)) {
+				log.warn("Authorization校验失败!!");
+				// 校验不通过
+                HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.UNAUTHORIZED, HttpResponseStatus.UNAUTHORIZED.toString());
+                // 校验不通过
+                return false;
+			}
+
+			// 密码校验
+//            boolean authFlag = auth(ctx, uri);
+//            if (!authFlag) {
+//                // 校验不通过
+//                HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.UNAUTHORIZED, HttpResponseStatus.UNAUTHORIZED.toString());
+//                // 校验不通过
+//                return false;
+//            }
+
+            // uri 路径校验
+//            if (!uri.getPath().startsWith(UPLOAD_FILE_URL)) {
+//                HttpResponseUtils.sendResponseJson(ctx, HttpResponseStatus.BAD_REQUEST,"the url must starts with /postfile");
+//                return false;
+//            }
+
+            return true;
+        } catch (Exception exception) {
+            exception.printStackTrace();
+            log.error(getStackString(exception));
+            return false;
+        }
+    }
+
+    private String parseFileName(FullHttpRequest fullRequest) throws URISyntaxException {
+        URI uri = UriUtils.getURI(fullRequest);
+        Map<String, String> queryParams = UriUtils.getQueryParams(uri);
+        try {
+            if (queryParams.containsKey(FILENAME_PARAM)) {
+                return queryParams.get(FILENAME_PARAM);
+            } else {
+                SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY_MM_dd_HH_MM_SS_sss");
+                String filePureName = dateFormat.format(new Date());
+                return filePureName + "." + queryParams.get(FILE_EXTNAME_PARAM);
+            }
+        } catch (Exception exception) {
+			log.error(ExceptionUtils.getStackString(exception));
+            return String.valueOf(System.currentTimeMillis());
+        }
+    }
+
+    private void writeResponse(ChannelHandlerContext ctx, String context) {
+        ByteBuf buf = Unpooled.copiedBuffer(context, CharsetUtil.UTF_8);
+        FullHttpResponse response = new DefaultFullHttpResponse(
+                HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buf);
+        response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html;charset=utf-8");
+        //设置短连接 addListener 写完马上关闭连接
+        ctx.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
+    }
+
+    /**
+     * 进行请求的密码校验
+     * @param ctx
+     * @param uri
+     * @return
+     */
+    private boolean auth(ChannelHandlerContext ctx, URI uri) {
+        Map<String, String> queryParams = UriUtils.getQueryParams(uri);
+        String passwd = queryParams.get("passwd");
+        if (this.nettyHttpConfig.getFileUpPasswd().equals(passwd)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) {
+        ctx.close();
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+        log.error(getStackString(cause));
+        cause.printStackTrace();
+        ctx.close();
+    }
+}

--
Gitblit v1.9.3