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);
}