From c586f8e77aebc846da4de66010172c9c2905a00d Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Sat, 28 Feb 2026 15:22:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(aiot):=20snap=E7=AB=AF=E7=82=B9=E6=94=B9?= =?UTF-8?q?=E7=94=A8302=E9=87=8D=E5=AE=9A=E5=90=91=E5=88=B0COS=E5=85=AC?= =?UTF-8?q?=E5=85=B1URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 标签请求snap时,直接302重定向到COS公共URL, 浏览器自动跟随重定向加载图片。用sendRedirect绕过 GlobalResponseAdvice的WVPResult包装,避免byte[]类型转换错误。 同时GlobalResponseAdvice增加byte[]排除以防其他场景。 Co-Authored-By: Claude Opus 4.6 --- .../vmp/aiot/controller/AiRoiController.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiRoiController.java b/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiRoiController.java index 2d5a74096..7c5c60f86 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiRoiController.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiRoiController.java @@ -15,6 +15,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -88,22 +90,21 @@ public class AiRoiController { public ResponseEntity getSnap( @RequestParam String cameraCode, @RequestParam(defaultValue = "false") boolean force, - @RequestHeader(value = "Accept", defaultValue = "application/json") String accept) { + @RequestHeader(value = "Accept", defaultValue = "application/json") String accept, + HttpServletResponse httpResponse) throws IOException { Map result = screenshotService.requestScreenshot(cameraCode, force); - // 如果是 标签发起的请求(Accept: image/*),直接返回图片字节 + // 标签请求(Accept: image/*):302 重定向到 COS 公共 URL if (accept.contains("image/") && "ok".equals(result.get("status"))) { - byte[] image = screenshotService.proxyScreenshotImage(cameraCode); - if (image != null) { - return ResponseEntity.ok() - .contentType(MediaType.IMAGE_JPEG) - .header("Cache-Control", "max-age=60") - .body(image); + String cosUrl = (String) result.get("url"); + if (cosUrl != null && cosUrl.startsWith("https://")) { + httpResponse.sendRedirect(cosUrl); + return null; } } - // 默认返回 JSON(XHR/fetch 请求) + // JSON 请求(XHR/fetch):返回 JSON return ResponseEntity.ok(result); }