From a824fbd8a3972b2af07eb143b8776bc5620539fb Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期日, 19 二月 2023 12:22:35 +0800
Subject: [PATCH] 1

---
 src/main/java/com/lf/server/controller/data/WmtsController.java |   99 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 92 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/lf/server/controller/data/WmtsController.java b/src/main/java/com/lf/server/controller/data/WmtsController.java
index d72e3d4..8dd9fe8 100644
--- a/src/main/java/com/lf/server/controller/data/WmtsController.java
+++ b/src/main/java/com/lf/server/controller/data/WmtsController.java
@@ -2,6 +2,7 @@
 
 import com.lf.server.annotation.SysLog;
 import com.lf.server.config.PropertiesConfig;
+import com.lf.server.helper.StringHelper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -10,13 +11,27 @@
 import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.http.server.ServletServerHttpResponse;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.ServletOutputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+import java.util.Date;
+import java.util.List;
 
 /**
  * WMTS鏈嶅姟
@@ -67,21 +82,91 @@
     @ApiOperation(value = "鑾峰彇WMTS鐡︾墖")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "token", value = "浠ょ墝", required = true, dataType = "String", defaultValue = "token", paramType = "path"),
-            @ApiImplicitParam(name = "layer", value = "鍥惧眰绫诲瀷", required = true, dataType = "String", defaultValue = "TDTIMG"),
-            @ApiImplicitParam(name = "tilematrix", value = "灞傜骇", required = true, dataType = "Integer"),
-            @ApiImplicitParam(name = "tilerow", value = "琛屽彿", required = true, dataType = "Integer"),
-            @ApiImplicitParam(name = "tilecol", value = "鍒楀彿", required = true, dataType = "Integer")
+            @ApiImplicitParam(name = "layer", value = "鍥惧眰绫诲瀷", required = true, dataType = "String", defaultValue = "img"),
+            @ApiImplicitParam(name = "z", value = "灞傜骇", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "x", value = "琛屽彿", required = true, dataType = "Integer"),
+            @ApiImplicitParam(name = "y", value = "鍒楀彿", required = true, dataType = "Integer")
     })
     @GetMapping("select/{token}/tile")
-    public void selectWmtsTile(@RequestParam("layer") String layer, @RequestParam("tilematrix") Integer l, @RequestParam("tilerow") Integer r,
-                               @RequestParam("tilecol") Integer c, @RequestParam("format") String format, @PathVariable(name = "token") String token,
+    public void selectWmtsTile(@RequestParam("LAYER") String layer, @RequestParam("TILEMATRIX") Integer z, @RequestParam("TILEROW") Integer x,
+                               @RequestParam("TILECOL") Integer y, @PathVariable(name = "token") String token,
                                HttpServletRequest req, HttpServletResponse res) {
         try {
             // ServletServerHttpRequest ssRequest = new ServletServerHttpRequest(request)
-            String base = config.getTilePath();
+            if (StringHelper.isEmpty(layer) || null == z || null == x || null == y) {
+                return;
+            }
+
+            ServletServerHttpRequest ssReq = new ServletServerHttpRequest(req);
+            ServletServerHttpResponse ssRes = new ServletServerHttpResponse(res);
+
+            // 妫�鏌ョ紦瀛樻槸鍚﹁繃鏈�
+            if (checkIfNotModify(ssReq, ssRes)) {
+                // 璁剧疆缂撳瓨澶�
+                setBrowerCache(ssRes);
+                return;
+            }
+
+            // 璁剧疆杩斿洖鍥剧墖绫诲瀷
+            res.setContentType("image/png");
+            // 璁剧疆缂撳瓨鍙傛暟
+            setBrowerCache(ssRes);
+            // 閫氳繃response瀵硅薄锛岃幏鍙栧埌杈撳嚭娴�
+            ServletOutputStream outputStream = res.getOutputStream();
+            // 瀹氫箟杈撳叆娴侊紝閫氳繃杈撳叆娴佽鍙栨枃浠跺唴瀹�
+            FileInputStream fileInputStream;
+
+            String path = config.getTilePath() + File.separator + layer + File.separator + z + File.separator + x + File.separator + y + ".png";
+            File file = new File(path);
+            if (!file.exists() || file.isDirectory()) {
+                ClassPathResource resource = new ClassPathResource("wmts/nofound.png");
+                fileInputStream = new FileInputStream(resource.getFile());
+            } else {
+                fileInputStream = new FileInputStream(file);
+            }
+
+            int len = 0;
+            byte[] bytes = new byte[1024];
+            while ((len = fileInputStream.read(bytes)) != -1) {
+                // 閫氳繃杈撳叆娴佽鍙栨枃浠舵暟鎹紝鐒跺悗閫氳繃涓婅堪鐨勮緭鍑烘祦鍐欏洖娴忚鍣�
+                outputStream.write(bytes, 0, len);
+                outputStream.flush();
+            }
+
+            // 鍏抽棴璧勬簮
+            outputStream.close();
+            fileInputStream.close();
 
         } catch (Exception ex) {
             log.error(ex.getMessage(), ex);
         }
     }
+
+    /**
+     * 璁剧疆娴忚鍣ㄧ紦瀛樺弬鏁�
+     */
+    private void setBrowerCache(ServerHttpResponse res) {
+        HttpHeaders headers = res.getHeaders();
+        headers.setCacheControl("public, must-revalidate");
+
+        headers.setExpires(System.currentTimeMillis() + 24 * 60 * 60 * 1000);
+        headers.setAccessControlMaxAge(Duration.ofHours(24));
+        headers.setETag("\"" + new Date().toString() + "\"");
+        // must-revalidate
+        // response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
+    }
+
+    /**
+     * 楠岃瘉缂撳瓨鍙傛暟
+     */
+    boolean checkIfNotModify(ServerHttpRequest req, ServerHttpResponse res) {
+        List<String> etags = req.getHeaders().getIfNoneMatch();
+        if (0 == etags.size() || StringHelper.isEmpty(etags.get(0))) {
+            return false;
+        }
+
+        res.setStatusCode(HttpStatus.NOT_MODIFIED);
+
+        return true;
+    }
 }

--
Gitblit v1.9.3