From b206c32c48eae0ed63a08faa331581b04dff6858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Wed, 24 Jul 2024 16:45:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0s3=E5=AF=B9=E8=B1=A1=E5=AD=98?= =?UTF-8?q?=E5=82=A8demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/pom.xml | 11 +- .../controller/CameraControlController.java | 3 +- .../lib/hik/HikCameraControlModuleImpl.java | 1 + .../java/com/leaper/web/task/S3Utils.java | 138 ++++++++++++++++++ .../java/com/leaper/web/task/S3UtilsTest.java | 105 +++++++++++++ web/src/main/java/com/leaper/web/task/T.java | 4 + 6 files changed, 259 insertions(+), 3 deletions(-) create mode 100644 web/src/main/java/com/leaper/web/task/S3Utils.java create mode 100644 web/src/main/java/com/leaper/web/task/S3UtilsTest.java create mode 100644 web/src/main/java/com/leaper/web/task/T.java diff --git a/web/pom.xml b/web/pom.xml index 02c40e6..4700048 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -84,7 +84,16 @@ system ${project.basedir}/src/main/resources/libs/jna.jar - + + com.amazonaws + aws-java-sdk-s3 + 1.12.269 + + + junit + junit + 4.13.2 + com.sun.jna.examples test diff --git a/web/src/main/java/com/leaper/web/controller/CameraControlController.java b/web/src/main/java/com/leaper/web/controller/CameraControlController.java index 7e7a61a..1283197 100644 --- a/web/src/main/java/com/leaper/web/controller/CameraControlController.java +++ b/web/src/main/java/com/leaper/web/controller/CameraControlController.java @@ -351,8 +351,7 @@ public class CameraControlController { @ApiOperation(value = "录像") public Result MP4delay(@PathVariable Integer id) { //checkLogin(id); - plcService.cameraVideo(1,LocalDateTime.now().minusSeconds(id),LocalDateTime.now().plusSeconds(3)); - plcService.cameraVideo(2,LocalDateTime.now().minusSeconds(id),LocalDateTime.now().plusSeconds(3)); + plcService.cameraVideo(2,LocalDateTime.now().minusSeconds(3*60),LocalDateTime.now().plusSeconds(2*60)); /*String path = PathUtil.createFileName("mp4",id); String realPath = configProperties.getSavePath().getMp4Path() + path; TaskDelayExecutor.addMp4DelayTask(id,realPath,LocalDateTime.now().minusMinutes(2),LocalDateTime.now().minusSeconds(7),12000L);*/ diff --git a/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java b/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java index 9006b7b..de43d11 100644 --- a/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java +++ b/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java @@ -281,6 +281,7 @@ public class HikCameraControlModuleImpl implements CameraControlModule { } + public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end, ConfigProperties.SavePath savePath,Integer channel) { PathUtil.checkDirc(path); diff --git a/web/src/main/java/com/leaper/web/task/S3Utils.java b/web/src/main/java/com/leaper/web/task/S3Utils.java new file mode 100644 index 0000000..1754ad4 --- /dev/null +++ b/web/src/main/java/com/leaper/web/task/S3Utils.java @@ -0,0 +1,138 @@ +package com.leaper.web.task; + +import com.amazonaws.ClientConfiguration; +import com.amazonaws.Protocol; +import com.amazonaws.SdkClientException; +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.amazonaws.services.s3.model.GetObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectResult; +import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.S3ObjectInputStream; +import com.amazonaws.services.s3.transfer.internal.TransferManagerUtils; +import com.amazonaws.util.IOUtils; +import com.amazonaws.util.json.Jackson; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.ExecutorService; +import java.util.logging.Logger; + +public class S3Utils { + + private static final Logger LOGGER = Logger.getLogger("S3Utils"); + /** + * S3客户端接口 + */ + public AmazonS3 s3; + + /** + * 用作分片并行上传下载异步任务执行线程;该示例客户端实例上调用的并行上传下载异步任务都提交到此执行线程运行,请合理设置该执行线程的线程池大小;或者并行上传下载方法单独创建异步任务执行线程; + */ + private ExecutorService executorService; + + /** + * 客户端初始化 + * @param accessKey AK + * @param secretKey SK + * @param host endpoint S3服务地址 + */ + public void init(String accessKey, String secretKey, String host) { + AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + ClientConfiguration config = new ClientConfiguration(); + config.setProtocol(Protocol.HTTP); + //config.setRetryPolicy(PredefinedRetryPolicies.NO_RETRY_POLICY); + // 凭证验证方式 + config.setSignerOverride("S3SignerType"); + config.setSocketTimeout(180000); + config.setMaxConnections(50); + config.setConnectionTimeout(10000); + // 创建S3客户端,使用完需要关闭((AmazonS3Client) s3).shutdown(); + s3 = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withClientConfiguration(config) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(host, Regions.US_EAST_1.getName())).enablePathStyleAccess().build(); + //创建默认线程(10个固定线程)执行器,使用分片并行传输时用作执行线程,可以根据自己需求实现执行器。 + executorService = TransferManagerUtils.createDefaultExecutorService(); + } + + /** + * 客户端销毁 + */ + public void destroy() { + executorService.shutdown(); + ((AmazonS3Client) s3).shutdown(); + } + + /** + * 上传对象 + * @param bucketName 桶名称 + * @param fileName 对象名称,图片名称 + * @param file 文件 + */ + public PutObjectResult uploadFile(String bucketName, String fileName, File file) { + PutObjectResult putObjectResult = s3.putObject(bucketName, fileName, file); + LOGGER.info(Jackson.toJsonPrettyString(putObjectResult)); + LOGGER.info("upload object " + fileName + " success."); + return putObjectResult; + } + + /** + * 下载对象 + * @param bucketName bucket名称 + * @param key 对象名称 + * @param destinationFile 存储为本地的目标文件名 + */ + public ObjectMetadata downloadFile(String bucketName, String key, String destinationFile) { + GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key); + ObjectMetadata objectMetadata = s3.getObject(getObjectRequest, new File(destinationFile)); + LOGGER.info(Jackson.toJsonPrettyString(objectMetadata)); + LOGGER.info("download object " + key + " success."); + return objectMetadata; + } + + /** + * 上传流对象 + * @param bucketName bucket名称 + * @param key 对象名称 + * @param inputStream 上传内容 + * @param objectMetadata 上传内容元数据,Content-Length必须设置 + */ + public PutObjectResult uploadStream(String bucketName, String key, InputStream inputStream, ObjectMetadata objectMetadata) { + PutObjectResult putObjectResult = s3.putObject(bucketName, key, inputStream, objectMetadata); + LOGGER.info(Jackson.toJsonPrettyString(putObjectResult)); + LOGGER.info("upload object " + key + " success."); + return putObjectResult; + } + + /** + * 下载对象到流 + * @param bucketName bucket名称 + * @param key 对象名称 + * @param out 输出流 + */ + public ObjectMetadata downloadStream(String bucketName, String key, OutputStream out) { + GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key); + S3Object s3Object = s3.getObject(getObjectRequest); + ObjectMetadata objectMetadata = s3Object.getObjectMetadata(); + S3ObjectInputStream in = s3Object.getObjectContent(); + try { + IOUtils.copy(in, out); + } catch (IOException e) { + throw new SdkClientException(e); + } finally { + IOUtils.release(in, null); + } + LOGGER.info(Jackson.toJsonPrettyString(objectMetadata)); + LOGGER.info("download object " + key + " success."); + return objectMetadata; + } +} diff --git a/web/src/main/java/com/leaper/web/task/S3UtilsTest.java b/web/src/main/java/com/leaper/web/task/S3UtilsTest.java new file mode 100644 index 0000000..1796b85 --- /dev/null +++ b/web/src/main/java/com/leaper/web/task/S3UtilsTest.java @@ -0,0 +1,105 @@ +package com.leaper.web.task; + +import com.amazonaws.services.s3.model.ObjectMetadata; + +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.logging.Logger; + +public class S3UtilsTest { + + private static final Logger LOGGER = Logger.getLogger("S3Utils"); + + private static final String ACCESS_KEY = "minio"; + private static final String SECRET_KEY = "minio123"; + // 桶所在的区域对应网关URL的域名地址 + private static final String HOST = "192.168.1.52:9000"; + private static final String BUCKET_NAME = "camera"; + + private S3Utils s3Utils; + + @Before + public void init() { + s3Utils = new S3Utils(); + s3Utils.init(ACCESS_KEY, SECRET_KEY, HOST); + } + + /** + * 上传文件到桶中的根目录(不推荐) + */ + + /** + * 注意1:现场的网段可能属于生产的网络,demo中提供的HOST属于测试环境,公司策略无法从生产网络访问测试环,会导致连接超时 + * 注意2:需要开通现场服务器到S3服务器的80和443端口防火墙 + * + * 上传文件到桶中的指定目录(推荐) wcs-ocr-pic目录名 + */ + @Test + public void testUploadFile() { + s3Utils.uploadFile(BUCKET_NAME, "wcs-ocr-pic/1.png", new File("C:\\Users\\昊天\\Pictures\\2.jpg")); + // A目录下的B目录下的C对象 a/b/c + } + + /** + * 注意1:现场的网段可能属于生产的网络,demo中提供的HOST属于测试环境,公司策略无法从生产网络访问测试环,会导致连接超时 + * 注意2:需要开通现场服务器到S3服务器的80和443端口防火墙 + * + * 下载文件到指定目录 : 下载桶中的test.png 到D盘,且重新命名为aa.png + */ + @Test + public void testDownloadFile() { + s3Utils.downloadFile(BUCKET_NAME, "wcs-ocr-pic/1.png", "C:\\Users\\昊天\\Pictures\\2.jpg"); + } + + /** + * 上传流对象 + */ + @Test + public void testUploadStream() { + File file = new File("D:\\pic\\test.png"); + InputStream inputStream = null; + try { + inputStream = new FileInputStream(file); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + if (inputStream != null) { + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(file.length()); + s3Utils.uploadStream(BUCKET_NAME, "wcs-ocr-pic/2.png", inputStream, objectMetadata); + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 下载对象到流 + */ + @Test + public void testDownloadStream() { + OutputStream out = null; + try { + out = new FileOutputStream(new File("C:\\Users\\昊天\\Pictures\\2.jpg")); + s3Utils.downloadStream(BUCKET_NAME, "bg3.png", out); + } catch (FileNotFoundException e) { + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + } + } + } + } +} diff --git a/web/src/main/java/com/leaper/web/task/T.java b/web/src/main/java/com/leaper/web/task/T.java new file mode 100644 index 0000000..514e89a --- /dev/null +++ b/web/src/main/java/com/leaper/web/task/T.java @@ -0,0 +1,4 @@ +package com.leaper.web.task; + +public class T { +}