From 524b0f1b43e9d261b2790a13f9f838da69c3ed16 Mon Sep 17 00:00:00 2001 From: xiaoQQya Date: Thu, 15 Jun 2023 10:46:42 +0800 Subject: [PATCH] =?UTF-8?q?perf(snap):=20=E6=96=B0=E5=A2=9E=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=BF=AB=E7=85=A7,=20=E9=81=BF=E5=85=8D=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=20404=20=E6=8E=A7=E5=88=B6=E5=8F=B0=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vmanager/gb28181/device/DeviceQuery.java | 40 ++++++++++++------ src/main/resources/default.png | Bin 0 -> 16607 bytes 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/default.png diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index 06dfb0063..7f2c755b8 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -21,17 +21,15 @@ import com.genersoft.iot.vmp.vmanager.bean.BaseTree; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; +import com.google.common.io.Resources; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import org.apache.commons.compress.utils.IOUtils; import org.apache.ibatis.annotations.Options; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; @@ -39,10 +37,12 @@ import org.springframework.web.context.request.async.DeferredResult; import javax.servlet.http.HttpServletResponse; import javax.sip.InvalidArgumentException; import javax.sip.SipException; -import java.io.File; import java.io.IOException; -import java.io.InputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.text.ParseException; import java.util.*; @@ -462,21 +462,33 @@ public class DeviceQuery { return wvpResult; } + /** + * 请求截图. + * + * @param deviceId 设备 ID + * @param channelId 通道 ID + * @param mark 标记 + * @throws IOException IOException + */ @GetMapping("/snap/{deviceId}/{channelId}") @Operation(summary = "请求截图") @Parameter(name = "deviceId", description = "设备国标编号", required = true) @Parameter(name = "channelId", description = "通道国标编号", required = true) - @Parameter(name = "mark", description = "标识", required = false) - public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId, @RequestParam(required = false) String mark) { - + @Parameter(name = "mark", description = "标识") + public void getSnap(HttpServletResponse response, @PathVariable String deviceId, @PathVariable String channelId, @RequestParam(required = false) String mark) throws IOException { + String imageName = deviceId + "_" + channelId + (mark == null ? ".jpg" : ("_" + mark + ".jpg")); + byte[] image; try { - - final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + (mark == null? ".jpg": ("_" + mark + ".jpg"))).toPath()); - resp.setContentType(MediaType.IMAGE_PNG_VALUE); - IOUtils.copy(in, resp.getOutputStream()); + Path path = Paths.get("snap", imageName); + image = Files.readAllBytes(path); } catch (IOException e) { - resp.setStatus(HttpServletResponse.SC_NOT_FOUND); + URL url = Resources.getResource("classpath:default.png"); + image = Resources.toByteArray(url); } + response.setContentType(MediaType.IMAGE_PNG_VALUE); + response.setContentLength(image.length); + response.setHeader("Content-Disposition", ContentDisposition.inline().filename(imageName, StandardCharsets.UTF_8).build().toString()); + response.getOutputStream().write(image); } /** diff --git a/src/main/resources/default.png b/src/main/resources/default.png new file mode 100644 index 0000000000000000000000000000000000000000..a91e7779c5b7e17ba6c9f164f69de75030690191 GIT binary patch literal 16607 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 LJStJLeE&ZHb&*r6 literal 0 HcmV?d00001