zhanghua
2023-04-19 c68a46c7b29a7f5a21a76ea5e230cd140c2694d8
ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
@@ -14,11 +14,16 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.Dictionary;
import java.util.Hashtable;
/**
 * @author admin
@@ -27,9 +32,9 @@
@RestController
@RequestMapping("/API")
public class AlarmController {
    private IVideoAlarmReportService videoAlarmReportService;
    private static Dictionary<String, Integer> sessionDic = new Hashtable<>();
    @Autowired
    private VideoUtil videoUtil;
@@ -63,25 +68,88 @@
    @ApiOperation(value = "获取图片")
    @GetMapping(value = "/img", produces = MediaType.IMAGE_PNG_VALUE)
    @GetMapping(value = "/img", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
//    @GetMapping(value = "/img")
    @ResponseBody
    public byte[] getImages(HttpServletResponse response, @RequestParam String fileUrl) {
    public byte[] getImages(HttpServletRequest request, HttpServletResponse response,
                            @RequestParam String fileUrl, @RequestParam(required = false) String OSSAccessKeyId,
                            @RequestParam(required = false) String Signature) {
        String sessionId = request.getSession().getId();
        sessionDic.put(sessionId, 0);
        return getBytes(fileUrl, OSSAccessKeyId, Signature, sessionId);
    }
    private byte[] getBytes(String fileUrl, String OSSAccessKeyId, String Signature, String sessionId) {
        int index = sessionDic.get(sessionId);
        try {
            URL url = new URL(fileUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream inputStream = conn.getInputStream();// 通过输入流获取图片数据
            if (sessionDic.get(sessionId) < 10) {
                sessionDic.remove(sessionId);
                fileUrl = fileUrl.replace("Expires","v");
                System.out.println("getImages获取图片地址:" + fileUrl + "&OSSAccessKeyId=" + OSSAccessKeyId + "&Signature=" + Signature);
                URL url = new URL(fileUrl + "&OSSAccessKeyId=" + OSSAccessKeyId + "&Signature=" + Signature);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(10 * 1000);
                conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            byte[] bytes = new byte[inputStream.available()];
            inputStream.read(bytes, 0, inputStream.available());
                InputStream inputStream = conn.getInputStream();// 通过输入流获取图片数据
            return bytes;
                byte[] data = readInputStream(inputStream);
                System.out.println("getImages获取图片成功");
                return data;
            }
        } catch (Exception e) {
            index++;
            sessionDic.put(sessionId, index);
            System.out.println(index + "-getImages获取图片失败:" + e.getMessage());
            e.printStackTrace();
            getBytes(fileUrl, OSSAccessKeyId, Signature, sessionId);
        }
        return null;
    }
    private static String inputStream2Base64(InputStream is) throws Exception {
        byte[] data = null;
        try {
            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
            byte[] buff = new byte[100];
            int rc = 0;
            while ((rc = is.read(buff, 0, 100)) > 0) {
                swapStream.write(buff, 0, rc);
            }
            data = swapStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    throw new Exception("输入流关闭异常");
                }
            }
        }
        return Base64.getEncoder().encodeToString(data);
    }
    private byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度,如果为-1,代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while ((len = inStream.read(buffer)) != -1) {
            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }
}