Browse Source

调整打包

houweiyu 4 năm trước cách đây
mục cha
commit
4af17cc481

+ 2 - 2
kankan-daikan-application/src/main/java/kankan/daikan/KankanDaikanApplication.java

@@ -11,7 +11,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-import org.springframework.cloud.openfeign.EnableFeignClients;
+//import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Bean;
 import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 
@@ -24,7 +24,7 @@ import java.time.format.DateTimeFormatter;
  * @date 2021/1/5 12:25
  * @desciption
  */
-@EnableFeignClients
+//@EnableFeignClients
 //@NacosPropertySource(dataId = "abner-test", autoRefreshed = true)
 @EnableDiscoveryClient
 @SpringBootApplication(scanBasePackages = {"fdage.back.sdk.base.mybatis","fdage.back.sdk.core" , "kankan.daikan" , "fdage.back.sdk.base.swagger"})

+ 4 - 1
kankan-daikan-application/src/main/resources/application-dev.properties

@@ -41,4 +41,7 @@ image.oss.path=domain/daikan/
 oss.query.url=https://houseoss.4dkankan.com/
 image.local.path=C:\\Users\\4dage\\Desktop\\logo-file\\
 
-scenePath=https://test.4dkankan.com/
+scenePath=https://test.4dkankan.com/
+
+oss.video.file.path=domain/daikan/video/
+video-file-path: D:/video-files/

+ 3 - 0
kankan-daikan-application/src/main/resources/application-prod.properties

@@ -37,3 +37,6 @@ image.local.path=/image/
 
 
 scenePath=https://www.4dkankan.com/
+
+oss.video.file.path=domain/daikan/video/
+video-file-path: daikan/video-files/

+ 4 - 1
kankan-daikan-application/src/main/resources/application-test.properties

@@ -41,4 +41,7 @@ image.oss.path=domain/daikan/
 oss.query.url=https://houseoss.4dkankan.com/
 image.local.path=/image/
 
-scenePath=https://test.4dkankan.com/
+scenePath=https://test.4dkankan.com/
+
+oss.video.file.path=domain/daikan/video/
+video-file-path: daikan/video-files/

+ 4 - 1
kankan-daikan-application/src/main/resources/application-uat.properties

@@ -36,4 +36,7 @@ oss.query.url=https://houseoss.4dkankan.com/
 image.local.path=/image/
 
 
-scenePath=https://test.4dkankan.com/
+scenePath=https://test.4dkankan.com/
+
+oss.video.file.path=domain/daikan/video/
+video-file-path: daikan/video-files/

+ 18 - 0
kankan-daikan-core/pom.xml

@@ -34,4 +34,22 @@
 
 
 
+
+    <dependencies>
+        <dependency>
+            <groupId>org.bytedeco.javacpp-presets</groupId>
+            <artifactId>ffmpeg-platform</artifactId>
+            <version>4.0.2-1.4.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.bytedeco</groupId>
+            <artifactId>javacv</artifactId>
+            <version>1.4.3</version>
+        </dependency>
+
+    </dependencies>
+
+
+
 </project>

+ 67 - 0
kankan-daikan-core/src/main/java/kankan/daikan/base/utils/DataUtils.java

@@ -20,6 +20,12 @@ import java.math.BigDecimal;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
+import org.bytedeco.javacpp.opencv_core;
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.Frame;
+import org.bytedeco.javacv.Java2DFrameConverter;
+import org.bytedeco.javacv.OpenCVFrameConverter;
+
 
 import static com.google.zxing.client.j2se.MatrixToImageConfig.BLACK;
 import static com.google.zxing.client.j2se.MatrixToImageConfig.WHITE;
@@ -254,6 +260,67 @@ public class DataUtils {
             return true;
         }
     }
+    /**
+     * 获取视频的第一帧
+     * */
+    public static boolean executeCodecs(String filePath, String targetFilePath, String targetFileName ,String imageMat){
+        try {
+            FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
+            ff.start();
+            /**
+             * 如果拍摄的视频中带有旋转(rotate)信息,那么截取出来的图片就会被旋转
+             * getVideoMetadata("rotate")方法可以获取到视频的旋转信息。
+             * 根据获取到的rotate信息对ff.grabImage()得到的Frame进行旋转,
+             * 但是Frame并没有提供旋转接口。但有一个IpImage对象提供了旋转方法
+             */
+            String rotate = ff.getVideoMetadata("rotate");
+            Frame f;
+            int i = 0;
+            while (i < 1) {
+                f = ff.grabImage();
+                opencv_core.IplImage src = null;
+                if (null != rotate && rotate.length() > 1) {
+                    OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
+                    src = converter.convert(f);
+                    f = converter.convert(rotate(src, Integer.valueOf(rotate)));
+                }
+                doExecuteFrame(f, targetFilePath, targetFileName ,imageMat);
+                i++;
+            }
+            ff.stop();
+            return true;
+        } catch (Exception e) {
+            log.info("生成视频第一帧图片出错:{}" ,e);
+        }
+        return false;
+    }
+
+    /*
+     * 旋转角度的
+     */
+    public static   opencv_core.IplImage rotate(opencv_core.IplImage src, int angle) {
+        opencv_core.IplImage img = opencv_core.IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());
+        opencv_core.cvTranspose(src, img);
+        opencv_core.cvFlip(img, img, angle);
+        return img;
+    }
+
+    public static   void doExecuteFrame(Frame f, String targetFilePath, String targetFileName , String imageMat) {
+
+        if (null == f || null == f.image) {
+            return;
+        }
+        Java2DFrameConverter converter = new Java2DFrameConverter();
+        String fileName = targetFilePath + targetFileName + "." + imageMat;
+        BufferedImage bi = converter.getBufferedImage(f);
+        log.info("输出视频第一帧的图片的宽度:{},高度:{}" ,  bi.getWidth() , bi.getHeight());
+        File output = new File(fileName);
+        try {
+            ImageIO.write(bi, imageMat, output);
+        } catch (IOException e) {
+            log.info("生成视频第一帧图片出错:{}" ,e);
+        }
+    }
 
     public static void main(String[] args) throws Exception{
         createQRCode("https://www.4dkankan.com/spc.html?m=t-pnj0IJX", "C:/Users/4dage/Desktop/logo-file/t-pnj0IJX1.png", null);

+ 65 - 4
kankan-daikan-core/src/main/java/kankan/daikan/core/controller/CommonController.java

@@ -1,23 +1,26 @@
 package kankan.daikan.core.controller;
 
 import fdage.back.sdk.base.entity.Result;
+import fdage.back.sdk.base.enums.ResultCodeEnum;
+import fdage.back.sdk.base.exception.CommonBaseException;
 import fdage.back.sdk.core.alibabaUtils.AlibabaOssHelper;
 import fdage.back.sdk.core.alibabaUtils.AlibabaSmsService;
+import fdage.back.sdk.utils.FileUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import kankan.daikan.base.utils.DataUtils;
 import lombok.extern.log4j.Log4j2;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.apache.velocity.shaded.commons.io.FilenameUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Random;
 
 @Api(tags = "公共操作相关接口")
 @RestController
@@ -38,6 +41,13 @@ public class CommonController extends BaseController{
     @Value("${oss.query.url}")
     private String ossQueryUrl;
 
+    @Value("${oss.video.file.path}")
+    private String ossVideoPath;
+
+    @Value("${video-file-path}")
+    private String videoLocalBackupPath;
+
+
     @ApiOperation("上传照片(只支持JPG或者PNG格式)")
     @PostMapping(value = "/uploadImage")
     public Result<Object> uploadImage(@RequestParam("file") MultipartFile file) throws Exception {
@@ -92,5 +102,56 @@ public class CommonController extends BaseController{
         return Result.success(mp);
     }
 
+    @ApiOperation(value = "上传视频")
+    @PostMapping("/upLoadVideo")
+    @ResponseBody
+    @RequiresPermissions("sys:oss:all")
+    public Result uploadIntroduceVideo(@RequestParam("file") MultipartFile file) {
+        if (null == file) {
+            throw new CommonBaseException(ResultCodeEnum.D3001);
+        }
+        log.info("当前视频大小为:{} bytes" , file.getSize());
+        if(file.getSize() > 1024000000){
+            return Result.failure("视频不能超过1G");
+        }
+        String downLoanVideoPath = FileUtils.parseFile(file, videoLocalBackupPath);
+        log.info("视频文件已经下载到本地:{}", downLoanVideoPath);
+        //视频文件名一般为:xxx.mp4这种格式
+        String videoFilePureName = file.getOriginalFilename();
+        log.info("视频文件名为:{}", videoFilePureName);
+        //去掉格式,只获取纯名字
+        int index = videoFilePureName.indexOf(".");
+        //获取纯名字
+        if (index != -1) {
+            videoFilePureName = videoFilePureName.substring(0, index);
+        } else {
+            Random random = new Random();
+            videoFilePureName = "default_imag_" + random.nextInt(10000);
+            log.info("采用默认的图片名字:{}", videoFilePureName);
+        }
+        //这里默认第一帧图片是jpg格式
+        String imageFormatter = "jpg";
+        //视频在oss中的object name
+        String imageOssObjectName = ossVideoPath + videoFilePureName + "." + imageFormatter;
+        //截取视频第一帧图片
+        boolean cutFirstImageResult = DataUtils.executeCodecs(downLoanVideoPath, videoLocalBackupPath,
+                videoFilePureName, imageFormatter);
+
+        if (cutFirstImageResult) {
+            log.info("成功截取第一帧图片,将上传到oss上");
+            String imageLocalPath = videoLocalBackupPath + videoFilePureName + "." + imageFormatter;
+            alibabaOssHelper.doUploadThenDelete(imageLocalPath, imageOssObjectName);
+            log.info("上传第一帧图片到oss完成");
+        }
+
+        String videoObjectName = ossVideoPath + file.getOriginalFilename();
+        alibabaOssHelper.doUploadThenDelete(downLoanVideoPath, videoObjectName);
+
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("image", ossQueryUrl + imageOssObjectName);
+        resultMap.put("video", ossQueryUrl + videoObjectName);
+        return Result.success("视频文件上传oss结束", resultMap);
+    }
+
 
 }

+ 33 - 45
pom.xml

@@ -33,6 +33,7 @@
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
 
+
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -53,7 +54,6 @@
     </dependencyManagement>
 
 
-
     <dependencies>
         <!-- 引入四维sdk -->
         <dependency>
@@ -68,49 +68,12 @@
             </exclusions>
         </dependency>
 
-        <!-- nacos 注册中心依赖 -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.guava</groupId>
-                    <artifactId>guava</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>commons-io</groupId>
-                    <artifactId>commons-io</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <!-- nacos 配置中心依赖 -->
-        <dependency>
-            <groupId>com.alibaba.boot</groupId>
-            <artifactId>nacos-config-spring-boot-starter</artifactId>
-            <version>${nacos-config-spring-boot.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.guava</groupId>
-                    <artifactId>guava</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
         <!-- mybatis-plus逻辑删除依赖-->
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-core</artifactId>
             <version>3.3.1.tmp</version>
         </dependency>
-        <!-- Rpc feign依赖 -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-openfeign</artifactId>
-        </dependency>
-
         <dependency>
             <groupId>redis.clients</groupId>
             <artifactId>jedis</artifactId>
@@ -154,12 +117,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.rocketmq</groupId>
-            <artifactId>rocketmq-spring-boot-starter</artifactId>
-            <version>2.1.1</version>
-        </dependency>
-
-        <dependency>
             <groupId>com.fasterxml.jackson.datatype</groupId>
             <artifactId>jackson-datatype-jsr310</artifactId>
             <version>2.12.0</version>
@@ -178,8 +135,39 @@
             <version>3.4.0</version>
         </dependency>
 
-    </dependencies>
+        <!-- nacos 注册中心依赖 -->
+          <dependency>
+              <groupId>org.springframework.cloud</groupId>
+              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+              <exclusions>
+                  <exclusion>
+                      <groupId>com.google.guava</groupId>
+                      <artifactId>guava</artifactId>
+                  </exclusion>
+                  <exclusion>
+                      <groupId>commons-io</groupId>
+                      <artifactId>commons-io</artifactId>
+                  </exclusion>
+                  <exclusion>
+                      <groupId>org.springframework.boot</groupId>
+                      <artifactId>spring-boot-starter-tomcat</artifactId>
+                  </exclusion>
+              </exclusions>
+          </dependency>
+        <!-- nacos 配置中心依赖 -->
+         <dependency>
+              <groupId>com.alibaba.boot</groupId>
+              <artifactId>nacos-config-spring-boot-starter</artifactId>
+              <version>${nacos-config-spring-boot.version}</version>
+              <exclusions>
+                  <exclusion>
+                      <groupId>com.google.guava</groupId>
+                      <artifactId>guava</artifactId>
+                  </exclusion>
+              </exclusions>
+          </dependency>
 
+    </dependencies>
 
     <build>
         <plugins>