diff --git a/pom.xml b/pom.xml index 8a34a1a..398f135 100644 --- a/pom.xml +++ b/pom.xml @@ -51,8 +51,17 @@ fastjson2 2.0.53 + + + + + - + + io.minio + minio + 8.3.3 + diff --git a/src/main/java/com/tuoheng/steam/schedule/Scheduler.java b/src/main/java/com/tuoheng/steam/schedule/Scheduler.java index d363f77..a0351af 100644 --- a/src/main/java/com/tuoheng/steam/schedule/Scheduler.java +++ b/src/main/java/com/tuoheng/steam/schedule/Scheduler.java @@ -7,18 +7,55 @@ import com.tuoheng.steam.service.dos.FlvRecord; import com.tuoheng.steam.service.dos.Mp4Record; import com.tuoheng.steam.service.dos.StreamRecord; import com.tuoheng.steam.util.TimeUtils; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; +import io.minio.credentials.AssumeRoleProvider; +import io.minio.credentials.Credentials; +import io.minio.errors.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; + + +import java.io.*; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.*; @Component public class Scheduler { + @Value("${minio.oss.endpoint}") + private String endpoint; + + @Value("${minio.oss.accessKeyId}") + private String accessKeyId; + + @Value("${minio.oss.accessKeySecret}") + private String accessKeySecret; + + @Value("${minio.oss.bucketName}") + private String bucketName; + + //文件存储目录 + @Value("${minio.oss.filedir}") + private String filedir; + + @Value("${minio.oss.dajiangName}") + private String dajiangName; + + @Value("${minio.oss.dajiangPassword}") + private String dajiangPassword; + + //授权策略,允许访问名为bucket的桶的目录 + public static final String ROLE_ARN = "arn:aws:s3:::"; + + + private static final Logger logger = LoggerFactory.getLogger(Scheduler.class); @Autowired @@ -31,30 +68,144 @@ public class Scheduler { * 初次执行延迟6秒执行 * 每隔 60 分钟执行一次 60*60*1000 */ - @Scheduled(fixedRate = 3600000, initialDelay = 6000) - public void mergeTask() { - System.out.println("开始FLV到MP4的转换 - " + System.currentTimeMillis() / 1000); - List dayRecords = iRecordService.findDaysPath(); - for (int index = 0; index < dayRecords.size(); index++) { + @Scheduled(fixedRate = 3600000, initialDelay = 10) + public void mergeTask() throws Exception { +// File file = new File("/Users/sunpeng/workspace/text.txt"); +// InputStream inputStream = new FileInputStream(file); +// uploadFile2OSS(inputStream,"text.txt",file.length()); - DayRecord dayRecord = dayRecords.get(index); - if(TimeUtils.isBefore(dayRecord.getDay(),livedates)){ - dayRecord.clear(); - } else { - List streamRecords = dayRecord.getStreamRecords(); - for(StreamRecord streamRecord : streamRecords){ - List flvRecords = streamRecord.queryFlvRecords(); - for(FlvRecord flvRecord : flvRecords){ - iRecordService.mergeMp4(flvRecord); - } - } - } - } + getCredentials(); } + + /** + * 得到 临时凭据 + */ + private Credentials getCredentials() throws Exception { + + String POLICY_GET_AND_PUT = "{\n" + + " \"Version\": \"2012-10-17\",\n" + + " \"Statement\": [\n" + + " {\n" + + " \"Effect\": \"Allow\",\n" + + " \"Action\": [\n" + + " \"s3:GetObject\",\n" + + " \"s3:GetBucketLocation\",\n" + + " \"s3:PutObject\"\n" + + " ],\n" + + " \"Resource\": [\n" + + " \"arn:aws:s3:::"+bucketName+"/*\"\n" + + " ]\n" + + " }\n" + + " ]\n" + "}"; + + int durationSeconds = 360000;//秒 + //创建签名对象 + AssumeRoleProvider provider = new AssumeRoleProvider( + endpoint, + dajiangName, + dajiangPassword, + durationSeconds,//默认3600秒失效,设置小于这个就是3600,大于3600就实际值 + POLICY_GET_AND_PUT, + "us-east-1", + ROLE_ARN+bucketName+"/*", + "anysession", + null, + null); + + Credentials credentials = provider.fetch(); + + /** + * 下面的值按照大疆的要求传给大疆 + */ +// System.out.println("sessionToken=" + credentials.sessionToken()); +// System.out.println("accessKey=" + credentials.accessKey()); +// System.out.println("secretKey=" + credentials.secretKey()); +// System.out.println("isExpired=" + credentials.isExpired()); + + return credentials; + + } + + + + + private void uploadFile2OSS(InputStream inputStream, String fileName, long streamSize) throws Exception{ + // 初始化 MinioClient + MinioClient minioClient = MinioClient.builder() + .endpoint(endpoint) // MinIO 服务器地址 + .credentials(accessKeyId, accessKeySecret) // 访问密钥和秘密密钥 + .build(); + + + String contentType = getContentType(fileName.substring(fileName.lastIndexOf("."))); // 获取文件类型 + + minioClient.putObject( + PutObjectArgs.builder() + .bucket(bucketName) // 存储桶名称 + .object(filedir + "/" + fileName) // 对象名称(路径) + .stream(inputStream, streamSize, -1) // 输入流、文件大小(-1 表示未知大小) + .contentType(contentType) // 文件类型 + .build() + ); + } + + + private static String getContentType(String FilenameExtension) { + if (FilenameExtension.equalsIgnoreCase(".bmp")) { + return "image/bmp"; + } + if (FilenameExtension.equalsIgnoreCase(".gif")) { + return "image/gif"; + } + if (FilenameExtension.equalsIgnoreCase(".jpeg") || + FilenameExtension.equalsIgnoreCase(".jpg") || + FilenameExtension.equalsIgnoreCase(".png")) { + return "image/jpeg"; + } + if (FilenameExtension.equalsIgnoreCase(".html")) { + return "text/html"; + } + if (FilenameExtension.equalsIgnoreCase(".txt")) { + return "text/plain"; + } + if (FilenameExtension.equalsIgnoreCase(".vsd")) { + return "application/vnd.visio"; + } + if (FilenameExtension.equalsIgnoreCase(".pptx") || + FilenameExtension.equalsIgnoreCase(".ppt")) { + return "application/vnd.ms-powerpoint"; + } + if (FilenameExtension.equalsIgnoreCase(".docx") || + FilenameExtension.equalsIgnoreCase(".doc")) { + return "application/msword"; + } + if (FilenameExtension.equalsIgnoreCase(".xml")) { + return "text/xml"; + } + //PDF + if (FilenameExtension.equalsIgnoreCase(".pdf")) { + return "application/pdf"; + } + //excel + if (FilenameExtension.equalsIgnoreCase(".xls") || + FilenameExtension.equalsIgnoreCase(".xlsx")) { + return "application/octet-stream"; + } + //waypoints 拓恒+大疆的航线文件类型 + if (FilenameExtension.equalsIgnoreCase(".waypoints") || + FilenameExtension.equalsIgnoreCase(".kmz")) { + return "application/octet-stream"; + } + + return "image/jpeg"; + } + + + // public static boolean isWithin15Minutes(String timestamp1, String timestamp2) { // // 将字符串转换为 long 类型 // long time1 = Long.parseLong(timestamp1); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index efde9dd..df68d76 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -11,4 +11,12 @@ livedates=8 #srs.targetPath=/Users/sunpeng/workspace/stream/html #ffmpeg=ffmpeg #recordPath=/Users/sunpeng/workspace/stream/record -#livedates=7 \ No newline at end of file +#livedates=7 + +minio.oss.endpoint: https://minio-jndsj.t-aaron.com:2443 +minio.oss.accessKeyId: PJM0c2qlauoXv5TMEHm2 +minio.oss.accessKeySecret: Wr69Dm3ZH39M3GCSeyB3eFLynLPuGCKYfphixZuI +minio.oss.bucketName: th-airport +minio.oss.filedir: prodFile +minio.oss.dajiangName: dajiang +minio.oss.dajiangPassword: dajiang2025 \ No newline at end of file