shjung 1 year ago
parent
commit
a13a211acc

+ 5 - 0
conf/application.yml

@@ -2,6 +2,11 @@ application:
   name: 안동시 VMS 통신 서버
   listen-port: 3001
   ftp-home-dir: C:\DRIVE_E\ANDONG_VMS_FTP
+  ftp-server-ip: 115.91.74.42
+  ftp-server-port: 9871
+  ftp-passive-mode: 0
+  ftp-user-id: vmsuser
+  ftp-user-pswd: vmsuser#1234
   load-db: true
   check-new-form: false
 

+ 1 - 1
conf/debug.properties

@@ -1,5 +1,5 @@
 #system debug setting configuration...
-#Wed Nov 01 11:33:48 KST 2023
+#Wed Nov 01 16:18:00 KST 2023
 packet-info=1001
 packet-dump=1001
 system-debug=false

+ 16 - 1
pom.xml

@@ -69,7 +69,22 @@
             <artifactId>jansi</artifactId>
             <version>1.8</version>
         </dependency>
-
+<!--        <dependency>-->
+<!--            <groupId>com.fasterxml.jackson.core</groupId>-->
+<!--            <artifactId>jackson-annotations</artifactId>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.fasterxml.jackson.core</groupId>-->
+<!--            <artifactId>jackson-core</artifactId>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.fasterxml.jackson.core</groupId>-->
+<!--            <artifactId>jackson-databind</artifactId>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.fasterxml.jackson.datatype</groupId>-->
+<!--            <artifactId>jackson-datatype-hibernate5</artifactId>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>com.jcabi</groupId>
             <artifactId>jcabi-log</artifactId>

+ 11 - 0
src/main/java/com/its/vms/api/controller/VmsControlController.java

@@ -110,4 +110,15 @@ public class VmsControlController {
         return this.service.controlTimeSync(ctlrNmbr, req);
     }
 
+    @ApiOperation(value = "VMS File 업로드", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/file-upload/{symbLibNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes fileUpload(
+            @ApiParam(name = "symbLibNmbr", value = "파일심벌번호", example = "5001", required = true)
+            @PathVariable("symbLibNmbr") Long symbLibNmbr,
+            @ApiParam(name = "req", value = "VMS 파일 정보", required = true)
+            @RequestBody @Valid final VmsControlDto.VmsFileUploadReq req,
+            HttpServletRequest request) {
+        return this.service.fileUpload(symbLibNmbr, req);
+    }
+
 }

+ 39 - 0
src/main/java/com/its/vms/api/dto/VmsControlDto.java

@@ -326,4 +326,43 @@ public class VmsControlDto implements Serializable {
         }
     }
 
+    @ApiModel("VmsFileUploadReq(VMS File 업로드)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class VmsFileUploadReq {
+
+        @ApiModelProperty("심벌라이브러리 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
+        @JsonProperty("symb_lib_nmbr")
+        @PositiveOrZero
+        private Long symbLibNmbr;
+
+        @ApiModelProperty("심벌 파일 명, Nullable = Y, VARCHAR2(60)")  // Y VARCHAR2(60)
+        @JsonProperty("symb_file_nm")
+        @Size(max=60)
+        private String symbFileNm;
+
+        @ApiModelProperty("이미지 사이즈, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
+        @JsonProperty("imag_size")
+        @PositiveOrZero
+        private Long imagSize;
+
+        @ApiModelProperty("동영상인 경우 동영상 데이터, Nullable = Y, Image Data")  // Y BLOB
+        @JsonProperty("avi_data")
+        private byte[] aviData;
+
+        @Builder
+        public VmsFileUploadReq(Long symbLibNmbr, String symbFileNm, Long imagSize, byte[] aviData) {
+            this.symbLibNmbr = symbLibNmbr;
+            this.symbFileNm = symbFileNm;
+            this.imagSize = imagSize;
+            this.aviData = null;
+            if (aviData != null && aviData.length > 0) {
+                this.aviData = new byte[aviData.length];
+                System.arraycopy(aviData, 0, this.aviData, 0, aviData.length);
+            }
+        }
+    }
+
 }

+ 34 - 0
src/main/java/com/its/vms/api/service/VmsControlService.java

@@ -3,6 +3,7 @@ package com.its.vms.api.service;
 import com.its.app.utils.ItsUtils;
 import com.its.app.utils.SysUtils;
 import com.its.vms.api.dto.VmsControlDto;
+import com.its.vms.config.ApplicationConfig;
 import com.its.vms.dao.mapper.VmsCtlrMapper;
 import com.its.vms.domain.NET;
 import com.its.vms.dto.TbVmsCtlrDto;
@@ -15,11 +16,16 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
 @Slf4j
 @RequiredArgsConstructor
 @Service
 public class VmsControlService {
 
+    private final ApplicationConfig config;
     private final VmsCtlrMapper mapper;
     private final AppRepositoryService repoService;
 
@@ -313,4 +319,32 @@ public class VmsControlService {
         return statusControlReq(req.getUserId(), command, controlHeater);
     }
 
+    /**
+     * 파일 업로드(동영상 파일)
+     * @param symbLibNmbr
+     * @param req
+     * @return
+     */
+    public VmsControlDto.VmsControlRes fileUpload(Long symbLibNmbr, VmsControlDto.VmsFileUploadReq req) {
+        byte[] aviData  = req.getAviData();
+        String fileName = req.getSymbFileNm();
+        VmsControlDto.VmsControlRes result = new VmsControlDto.VmsControlRes(0, "success");
+        if (aviData.length > 0 && fileName != null) {
+            File file = new File(this.config.getFtpVideoDir() + fileName);
+            if (file.exists()) {
+                file.delete();
+            }
+
+            try (FileOutputStream fos = new FileOutputStream(file)) {
+                fos.write(aviData);
+            }
+            catch (IOException ioException) {
+                result.setResult(7, "파일 업로드 중 파일생성에 실패하였습니다. (" + fileName + ")");
+            }
+        }
+        else {
+            result.setResult(9, "파일을 생성할수 없습니다. (" + fileName + ")");
+        }
+        return result;
+    }
 }

+ 12 - 1
src/main/resources/application.yml

@@ -23,7 +23,18 @@ spring:
       idleTimeout: 30000
       connectTimeout: 10000
       pool-name: pool-vms-comm-server
-
+#  servlet:
+#    context-path: /
+#    session:
+#      tracking-mode: cookie
+#      timeout: 1200
+#    multipart:
+#      enabled: true
+#      file-size-threshold: 10MB
+#      max-file-size: 300MB
+#      max-request-size: 300MB
+#  jackson:
+#    property-naming-strategy: LOWER_CASE
 server:
   port: 8904
   shutdown: graceful