shjung 1 year ago
parent
commit
a436584837
35 changed files with 1453 additions and 98 deletions
  1. 639 0
      App_Data/mip_data/mip/logs/mip_sdk.miplog
  2. BIN
      App_Data/mip_data/mip/mip.policies.sqlite3
  3. BIN
      App_Data/mip_data/mip/telemetry-shm
  4. BIN
      App_Data/mip_data/mip/telemetry-wal
  5. 1 1
      conf/AipGatewayApi.pid
  6. BIN
      sample-44.pptx
  7. 11 0
      src/main/java/com/aip/gateway/api/aip/manager/AipFileManager.java
  8. 6 3
      src/main/java/com/aip/gateway/api/aip/manager/FileManager.java
  9. 1 1
      src/main/java/com/aip/gateway/api/aip/model/SetFileInfo.java
  10. 53 16
      src/main/java/com/aip/gateway/api/aip/utils/AipFileStream.java
  11. 18 2
      src/main/java/com/aip/gateway/api/aip/utils/AipFileUtils.java
  12. 20 0
      src/main/java/com/aip/gateway/api/config/FileStorageConfig.java
  13. 4 4
      src/main/java/com/aip/gateway/api/controller/ApiAipController.java
  14. 5 5
      src/main/java/com/aip/gateway/api/controller/ApiDbController.java
  15. 74 7
      src/main/java/com/aip/gateway/api/controller/ApiFileController.java
  16. 7 7
      src/main/java/com/aip/gateway/api/controller/ApiStreamController.java
  17. 11 8
      src/main/java/com/aip/gateway/api/controller/BaseController.java
  18. 31 4
      src/main/java/com/aip/gateway/api/entity/TbAipFileJobLog.java
  19. 42 7
      src/main/java/com/aip/gateway/api/interceptor/AipApiControllerInterceptor.java
  20. 22 0
      src/main/java/com/aip/gateway/api/model/app/CheckAip.java
  21. 11 0
      src/main/java/com/aip/gateway/api/model/file/FileNotFoundException.java
  22. 11 0
      src/main/java/com/aip/gateway/api/model/file/FileStorageException.java
  23. 19 0
      src/main/java/com/aip/gateway/api/model/file/UploadFileResponse.java
  24. 38 0
      src/main/java/com/aip/gateway/api/model/response/ResponseBase.java
  25. 7 2
      src/main/java/com/aip/gateway/api/model/response/ResponseFile.java
  26. 8 2
      src/main/java/com/aip/gateway/api/model/response/ResponseStream.java
  27. 0 1
      src/main/java/com/aip/gateway/api/process/DbmsDataType.java
  28. 28 0
      src/main/java/com/aip/gateway/api/repository/GlobalConstants.java
  29. 73 0
      src/main/java/com/aip/gateway/api/service/FileStorageService.java
  30. 84 2
      src/main/java/com/aip/gateway/api/service/impl/AbstractAipService.java
  31. 1 1
      src/main/java/com/aip/gateway/api/service/impl/ApiDbService.java
  32. 70 8
      src/main/java/com/aip/gateway/api/service/impl/ApiFileService.java
  33. 147 15
      src/main/java/com/aip/gateway/api/service/impl/ApiStreamService.java
  34. 10 1
      src/main/resources/application.yml
  35. 1 1
      src/main/resources/mybatis/mapper/BaseDbMapper.xml

File diff suppressed because it is too large
+ 639 - 0
App_Data/mip_data/mip/logs/mip_sdk.miplog


BIN
App_Data/mip_data/mip/mip.policies.sqlite3


BIN
App_Data/mip_data/mip/telemetry-shm


BIN
App_Data/mip_data/mip/telemetry-wal


+ 1 - 1
conf/AipGatewayApi.pid

@@ -1 +1 @@
-23628
+29500

BIN
sample-44.pptx


+ 11 - 0
src/main/java/com/aip/gateway/api/aip/manager/AipFileManager.java

@@ -123,6 +123,17 @@ public class AipFileManager extends  AipFileManagerBase {
         }
         return fileInfo;
     }
+    public AipFileInfo getFileInfo(String fileName, String actualFileName) {
+        if (!checkLoading()) {
+            return new AipFileInfo(10, "AIP 라이브러리가 초기화 되지 않았습니다.");
+        }
+        AipFileInfo fileInfo = _fileManager.getFileInfo(fileName, actualFileName);
+        if (fileInfo == null) {
+            setError(_fileManager.getLastErrNo(), "AipFileManager::GetFileInfo Failed.", _fileManager.getLastErrMsg());
+            return new AipFileInfo(11, _fileManager.getLastErrMsg());
+        }
+        return fileInfo;
+    }
     public AipFileInfo getFileInfo(IStream fileStream, String outputFileName) {
         if (!checkLoading()) {
             return new AipFileInfo(10, "AIP 라이브러리가 초기화 되지 않았습니다.");

+ 6 - 3
src/main/java/com/aip/gateway/api/aip/manager/FileManager.java

@@ -131,6 +131,7 @@ public class FileManager extends AbstractManager {
         IFileHandler handler = createFileHandler(fileStream, outputFileName);
         if (handler == null) {
             //AipFileUtils.delete(outputFileName);
+            log.error("getFileInfo.createFileHandler failed: {}", lastErrMsg);
             return null;
         }
         AipFileInfo result = getFileInfo(handler);
@@ -145,7 +146,10 @@ public class FileManager extends AbstractManager {
         return result;
     }
     public AipFileInfo getFileInfo(String fileName) {
-        IFileHandler handler = createFileHandler(fileName, fileName);
+        return getFileInfo(fileName, fileName);
+    }
+    public AipFileInfo getFileInfo(String fileName, String actualFileName) {
+        IFileHandler handler = createFileHandler(fileName, actualFileName);
         if (handler == null) {
             return null;
         }
@@ -158,13 +162,12 @@ public class FileManager extends AbstractManager {
 
     private AipFileInfo getFileInfo(IFileHandler handler) {
         if (handler == null) {
+            log.error("FileManager.getFileInfo: FileHandler is null");
             return null;
         }
 
         AipFileInfo fileInfo = new AipFileInfo(0, "");
 
-        log.error("AipFileInfo: {}", handler.getOutputFileName());
-
         fileInfo.setOutputFileName(handler.getOutputFileName());
 
         if (handler.getLabel() != null) {

+ 1 - 1
src/main/java/com/aip/gateway/api/aip/model/SetFileInfo.java

@@ -18,7 +18,7 @@ public class SetFileInfo {
 
     public SetFileInfo() {
         this.errorNo = 0;
-        this.errorMsg = "success";
+        this.errorMsg = "Success";
         this.labelGuid = "";
         this.templateGuid = "";
         this.fileOwner = "";

+ 53 - 16
src/main/java/com/aip/gateway/api/aip/utils/AipFileStream.java

@@ -1,38 +1,65 @@
 package com.aip.gateway.api.aip.utils;
 
 import com.microsoft.informationprotection.IStream;
+import lombok.extern.slf4j.Slf4j;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.Base64;
 
+@Slf4j
 public class AipFileStream implements IStream {
 
-    private byte[] fileData;
+    private InputStream inputStream;
+    private OutputStream outputStream;
 
     public AipFileStream(String fileDataString) {
-        this.fileData = Base64.getDecoder().decode(fileDataString);;
+        byte[] fileData = Base64.getDecoder().decode(fileDataString);
+        this.inputStream = new ByteArrayInputStream(fileData);
     }
 
     @Override
-    public long read(byte[] bytes, long l) {
-        int readLength = (int)Math.min(l, fileData.length);
-        bytes = new byte[readLength];
-        System.arraycopy(fileData, 0, bytes, 0, readLength);
-        return readLength;
+    public long read(byte[] buffer, long position) {
+        try {
+            inputStream.skip(position);
+            return inputStream.read(buffer);
+        } catch (IOException e) {
+            log.error("read failed. {}", e.getMessage());
+            return -1;
+        }
     }
 
     @Override
-    public long write(byte[] bytes) {
-        return 0;
+    public long write(byte[] data) {
+        try {
+            outputStream.write(data);
+            return data.length;
+        } catch (IOException e) {
+            log.error("write failed. {}", e.getMessage());
+            return -1;
+        }
     }
 
     @Override
     public boolean flush() {
-        return true;
+        try {
+            outputStream.flush();
+            return true;
+        } catch (IOException e) {
+            log.error("flush failed. {}", e.getMessage());
+            return false;
+        }
     }
 
     @Override
-    public void seek(long l) {
-
+    public void seek(long position) {
+        try {
+            inputStream.skip(position);
+        } catch (IOException e) {
+            log.error("seek failed. {}", e.getMessage());
+        }
     }
 
     @Override
@@ -47,16 +74,26 @@ public class AipFileStream implements IStream {
 
     @Override
     public long position() {
-        return 0;
+        try {
+            return inputStream.available();
+        } catch (IOException e) {
+            log.error("position failed. {}", e.getMessage());
+            return -1;
+        }
     }
 
     @Override
     public long size() {
-        return this.fileData.length;
+        try {
+            return inputStream.available();
+        } catch (IOException e) {
+            log.error("size failed. {}", e.getMessage());
+            return -1;
+        }
     }
 
     @Override
-    public void size(long l) {
-
+    public void size(long newSize) {
+        // Not applicable for input stream
     }
 }

+ 18 - 2
src/main/java/com/aip/gateway/api/aip/utils/AipFileUtils.java

@@ -7,6 +7,9 @@ import org.springframework.util.StringUtils;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Base64;
 
 @Slf4j
 public class AipFileUtils {
@@ -22,8 +25,8 @@ public class AipFileUtils {
     }
 
     public static String getFileName(String fileName) {
-        String name = FilenameUtils.getName(fileName);
-        return name;
+        return FilenameUtils.getName(fileName);
+        //return name;
     }
     public static String getFileNameWithoutExtension(String fileName) {
         return StringUtils.stripFilenameExtension(getFileName(fileName));
@@ -44,6 +47,19 @@ public class AipFileUtils {
         return false;
     }
 
+    public static String getFileDataString(String fileName) {
+        String result = "";
+        try {
+            byte[] fileBytes = Files.readAllBytes(Path.of(fileName));
+            result = Base64.getEncoder().encodeToString(fileBytes);
+        }
+        catch (Exception e) {
+            log.error("AipFileUtils.getFileDataString: {}", e.getMessage());
+            result = "";
+        }
+        return result;
+    }
+
     public static boolean streamToFile(byte[] byteArrayData, String fileName) {
         boolean result = true;
         try {

+ 20 - 0
src/main/java/com/aip/gateway/api/config/FileStorageConfig.java

@@ -0,0 +1,20 @@
+package com.aip.gateway.api.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Slf4j
+@Getter
+@Setter
+@ToString
+@Configuration
+@ConfigurationProperties(prefix = "file")
+public class FileStorageConfig {
+
+    private String uploadDir;
+
+}

+ 4 - 4
src/main/java/com/aip/gateway/api/controller/ApiAipController.java

@@ -48,7 +48,7 @@ public class ApiAipController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.downloadAipInfo());
+            return responseSuccess(request, this.service.downloadAipInfo());
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/aip/download, {}", e.getMessage());
@@ -74,7 +74,7 @@ public class ApiAipController extends  BaseController {
             return ResponseEntity.ok().body(ApiResponseModel.builder()
                     .success(true)
                     .statusCode(HttpStatus.OK.value())
-                    .message("success")
+                    .message("Success")
                     .result(response)
                     .build());
         }
@@ -102,7 +102,7 @@ public class ApiAipController extends  BaseController {
             return ResponseEntity.ok().body(ApiResponseModel.builder()
                     .success(true)
                     .statusCode(HttpStatus.OK.value())
-                    .message("success")
+                    .message("Success")
                     .result(response)
                     .build());
         }
@@ -130,7 +130,7 @@ public class ApiAipController extends  BaseController {
             return ResponseEntity.ok().body(ApiResponseModel.builder()
                     .success(true)
                     .statusCode(HttpStatus.OK.value())
-                    .message("success")
+                    .message("Success")
                     .result(response)
                     .build());
         }

+ 5 - 5
src/main/java/com/aip/gateway/api/controller/ApiDbController.java

@@ -50,7 +50,7 @@ public class ApiDbController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.reloadDatabase());
+            return responseSuccess(request, this.service.reloadDatabase());
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/db/reload, {}", e.getMessage());
@@ -76,7 +76,7 @@ public class ApiDbController extends  BaseController {
             return ResponseEntity.ok().body(ApiResponseModel.builder()
                     .success(true)
                     .statusCode(HttpStatus.OK.value())
-                    .message("success")
+                    .message("Success")
                     .result(response)
                     .build());
         }
@@ -104,7 +104,7 @@ public class ApiDbController extends  BaseController {
             return ResponseEntity.ok().body(ApiResponseModel.builder()
                     .success(true)
                     .statusCode(HttpStatus.OK.value())
-                    .message("success")
+                    .message("Success")
                     .result(response)
                     .build());
         }
@@ -132,7 +132,7 @@ public class ApiDbController extends  BaseController {
             return ResponseEntity.ok().body(ApiResponseModel.builder()
                     .success(true)
                     .statusCode(HttpStatus.OK.value())
-                    .message("success")
+                    .message("Success")
                     .result(response)
                     .build());
         }
@@ -160,7 +160,7 @@ public class ApiDbController extends  BaseController {
             return ResponseEntity.ok().body(ApiResponseModel.builder()
                     .success(true)
                     .statusCode(HttpStatus.OK.value())
-                    .message("success")
+                    .message("Success")
                     .result(response)
                     .build());
         }

+ 74 - 7
src/main/java/com/aip/gateway/api/controller/ApiFileController.java

@@ -1,5 +1,6 @@
 package com.aip.gateway.api.controller;
 
+import com.aip.gateway.api.model.file.UploadFileResponse;
 import com.aip.gateway.api.model.request.RequestFile;
 import com.aip.gateway.api.model.request.RequestFileAllSet;
 import com.aip.gateway.api.model.request.RequestFileDel;
@@ -7,6 +8,7 @@ import com.aip.gateway.api.model.request.RequestFileSet;
 import com.aip.gateway.api.model.response.ApiResponseModel;
 import com.aip.gateway.api.repository.AppRepository;
 import com.aip.gateway.api.repository.GlobalConstants;
+import com.aip.gateway.api.service.FileStorageService;
 import com.aip.gateway.api.service.IApiFileService;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.v3.oas.annotations.Operation;
@@ -17,9 +19,16 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import java.io.IOException;
 
 @Slf4j
 @Tag(name = "ApiFile", description = "FILE AIP API")
@@ -32,6 +41,7 @@ public class ApiFileController extends  BaseController {
 
     private final AppRepository appRepo;
     private final IApiFileService service;
+    private final FileStorageService fileStorageService;
 
     @Operation(summary = "File Info", description = "AIP File Information Query.")
     @ApiResponse(responseCode = "200", description = "AIP File Information query Success.")
@@ -47,7 +57,7 @@ public class ApiFileController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.getInfo(req));
+            return responseSuccess(request, this.service.getInfo(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/file/info, {}", e.getMessage());
@@ -69,7 +79,7 @@ public class ApiFileController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.setLabel(req));
+            return responseSuccess(request, this.service.setLabel(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/file/set-label, {}", e.getMessage());
@@ -91,7 +101,7 @@ public class ApiFileController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.delLabel(req));
+            return responseSuccess(request, this.service.delLabel(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/file/delete-label, {}", e.getMessage());
@@ -113,7 +123,7 @@ public class ApiFileController extends  BaseController {
              if (authError != 0) {
                  return responseApiKeyValidationError(request, authError);
              }
-             return responseSuccess(this.service.setProtection(req));
+             return responseSuccess(request, this.service.setProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/file/set-protection, {}", e.getMessage());
@@ -135,7 +145,7 @@ public class ApiFileController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.delProtection(req));
+            return responseSuccess(request, this.service.delProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/file/delete-protection, {}", e.getMessage());
@@ -157,7 +167,7 @@ public class ApiFileController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.setLabelProtection(req));
+            return responseSuccess(request, this.service.setLabelProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/file/set-label-protection, {}", e.getMessage());
@@ -179,7 +189,7 @@ public class ApiFileController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.delLabelProtection(req));
+            return responseSuccess(request, this.service.delLabelProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/file/delete-label-protection, {}", e.getMessage());
@@ -187,4 +197,61 @@ public class ApiFileController extends  BaseController {
         }
     }
 
+    // https://www.callicoder.com/spring-boot-file-upload-download-rest-api-example/
+    @PostMapping(value = "uploadFile", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE})
+    public UploadFileResponse uploadFile(
+            @Parameter(description = "multipart/form-data 형식의 파일을 input 으로 받습니다. 이때 key 값은 multipartFile 입니다.")
+            @RequestParam("file") MultipartFile file,
+            @RequestParam("apiKey") String apiKey,
+            @RequestParam("password") String password,
+            @RequestParam("email") String email)
+    {
+        log.error("    file: {}", file.getOriginalFilename());
+        log.error("    file: {}", file.getName());
+        String fileName = fileStorageService.storeFile(file);
+        log.error("fileName: {}", fileName);
+        log.error("  apiKey: {}", apiKey);
+        log.error("password: {}", password);
+        log.error("   email: {}", email);
+
+        String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
+                .path("/downloadFile/")
+                .path(fileName)
+                .toUriString();
+
+        return new UploadFileResponse(fileName, fileDownloadUri,
+                file.getContentType(), file.getSize());
+    }
+//    @PostMapping("/uploadMultipleFiles")
+//    public List<UploadFileResponse> uploadMultipleFiles(@RequestParam("files") MultipartFile[] files) {
+//        return Arrays.asList(files)
+//                .stream()
+//                .map(file -> uploadFile(file))
+//                .collect(Collectors.toList());
+//    }
+
+    @GetMapping("/downloadFile/{fileName:.+}")
+    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletRequest request) {
+        // Load file as Resource
+        Resource resource = fileStorageService.loadFileAsResource(fileName);
+
+        // Try to determine file's content type
+        String contentType = null;
+        try {
+            contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
+        } catch (IOException ex) {
+            log.info("Could not determine file type.");
+        }
+
+        // Fallback to the default content type if type could not be determined
+        if(contentType == null) {
+            contentType = "application/octet-stream";
+        }
+
+        return ResponseEntity.ok()
+                .contentType(MediaType.parseMediaType(contentType))
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
+                .body(resource);
+    }
+
 }

+ 7 - 7
src/main/java/com/aip/gateway/api/controller/ApiStreamController.java

@@ -47,7 +47,7 @@ public class ApiStreamController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.getInfo(req));
+            return responseSuccess(request, this.service.getInfo(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/stream/info, {}", e.getMessage());
@@ -69,7 +69,7 @@ public class ApiStreamController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.setLabel(req));
+            return responseSuccess(request, this.service.setLabel(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/stream/set-label, {}", e.getMessage());
@@ -91,7 +91,7 @@ public class ApiStreamController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.delLabel(req));
+            return responseSuccess(request, this.service.delLabel(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/stream/delete-label, {}", e.getMessage());
@@ -113,7 +113,7 @@ public class ApiStreamController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.setProtection(req));
+            return responseSuccess(request, this.service.setProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/stream/set-protection, {}", e.getMessage());
@@ -135,7 +135,7 @@ public class ApiStreamController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.delProtection(req));
+            return responseSuccess(request, this.service.delProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/stream/delete-protection, {}", e.getMessage());
@@ -157,7 +157,7 @@ public class ApiStreamController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.setLabelProtection(req));
+            return responseSuccess(request, this.service.setLabelProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/stream/set-label-protection, {}", e.getMessage());
@@ -179,7 +179,7 @@ public class ApiStreamController extends  BaseController {
             if (authError != 0) {
                 return responseApiKeyValidationError(request, authError);
             }
-            return responseSuccess(this.service.delLabelProtection(req));
+            return responseSuccess(request, this.service.delLabelProtection(req));
         }
         catch (Exception e) {
             log.error("exception: /v1/aip-api/stream/delete-label-protection, {}", e.getMessage());

+ 11 - 8
src/main/java/com/aip/gateway/api/controller/BaseController.java

@@ -39,38 +39,41 @@ public class BaseController {
         return ipAddr;
     }
 
-    protected ResponseEntity<ApiResponseModel> responseSuccess(GeneralResponse response) {
+    protected ResponseEntity<ApiResponseModel> responseSuccess(HttpServletRequest request, GeneralResponse response) {
         return ResponseEntity.ok().body(ApiResponseModel.builder()
                 .success(true)
                 .statusCode(HttpStatus.OK.value())
-                .message("success")
+                .message("Success")
                 .result(response)
                 .build());
     }
 
-    protected ResponseEntity<ApiResponseModel> responseSuccess(ResponseInfo response) {
+    protected ResponseEntity<ApiResponseModel> responseSuccess(HttpServletRequest request, ResponseInfo response) {
+        request.setAttribute(GlobalConstants.API_RESULT, (ResponseBase)response);
         return ResponseEntity.ok().body(ApiResponseModel.builder()
                 .success(true)
                 .statusCode(HttpStatus.OK.value())
-                .message("success")
+                .message("Success")
                 .result(response)
                 .build());
     }
 
-    protected ResponseEntity<ApiResponseModel> responseSuccess(ResponseFile response) {
+    protected ResponseEntity<ApiResponseModel> responseSuccess(HttpServletRequest request, ResponseFile response) {
+        request.setAttribute(GlobalConstants.API_RESULT, (ResponseBase)response);
         return ResponseEntity.ok().body(ApiResponseModel.builder()
                 .success(true)
                 .statusCode(HttpStatus.OK.value())
-                .message("success")
+                .message("Success")
                 .result(response)
                 .build());
     }
 
-    protected  ResponseEntity<ApiResponseModel> responseSuccess(ResponseStream response) {
+    protected  ResponseEntity<ApiResponseModel> responseSuccess(HttpServletRequest request, ResponseStream response) {
+        request.setAttribute(GlobalConstants.API_RESULT, (ResponseBase)response);
         return ResponseEntity.ok().body(ApiResponseModel.builder()
                 .success(true)
                 .statusCode(HttpStatus.OK.value())
-                .message("success")
+                .message("Success")
                 .result(response)
                 .build());
     }

+ 31 - 4
src/main/java/com/aip/gateway/api/entity/TbAipFileJobLog.java

@@ -1,11 +1,10 @@
 package com.aip.gateway.api.entity;
 
-import lombok.Builder;
 import lombok.Data;
 import lombok.ToString;
 
 @Data
-@Builder
+//@Builder
 @ToString
 public class TbAipFileJobLog {
 
@@ -16,13 +15,13 @@ public class TbAipFileJobLog {
     private String fileOwner;
     private String fileLabelGuid;
     private String fileProtectionGuid;
-    private Long fileSize;
+    private long fileSize;
     private String newFileName;
     private String newFileExt;
     private String newFileOwner;
     private String newFileLabelGuid;
     private String newFileProtectionGuid;
-    private Long newFileSize;
+    private long newFileSize;
     private String apiGuid;
     private String jobOwner;
     private String serverIpAddr;
@@ -32,4 +31,32 @@ public class TbAipFileJobLog {
     private int jobTime;
     private String jobMessage;
 
+    public TbAipFileJobLog(int apiId, String fileId, String apiGuid, String serverIpAddr, String apiKey) {
+        this.apiId = apiId;
+        this.fileId = fileId;
+        this.apiGuid = apiGuid;
+        this.serverIpAddr = serverIpAddr;
+        this.apiKey = apiKey;
+        this.fileName = "";
+        this.fileExt = "";
+        this.fileOwner = "";
+        this.fileLabelGuid = "";
+        this.fileProtectionGuid = "";
+        this.fileSize = 0;
+
+        this.newFileName = "";
+        this.newFileExt = "";
+        this.newFileOwner = "";
+        this.newFileLabelGuid = "";
+        this.newFileProtectionGuid = "";
+        this.newFileSize = 0;
+
+        this.jobOwner = "";
+        this.decryptKey = "";
+
+        this.jobResult = 0;
+        this.jobMessage = "";
+
+        this.jobTime = 0;
+    }
 }

+ 42 - 7
src/main/java/com/aip/gateway/api/interceptor/AipApiControllerInterceptor.java

@@ -1,6 +1,8 @@
 package com.aip.gateway.api.interceptor;
 
 import com.aip.gateway.api.entity.TbAipCallLog;
+import com.aip.gateway.api.entity.TbAipFileJobLog;
+import com.aip.gateway.api.model.response.ResponseBase;
 import com.aip.gateway.api.process.DbmsData;
 import com.aip.gateway.api.process.DbmsDataProcess;
 import com.aip.gateway.api.process.DbmsDataType;
@@ -60,21 +62,23 @@ public class AipApiControllerInterceptor implements HandlerInterceptor {
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
         // 응답 완료 후 실행되는 로직 (필요한 경우 사용)
         long endTime = System.currentTimeMillis();
-        long startTime = (long)request.getAttribute(GlobalConstants.API_START_MILLISECONDS);
+        long startTime = GlobalConstants.getAttributeLong(request, GlobalConstants.API_START_MILLISECONDS);
         int errorCode = 0;
         String errorMessage = "";
         int responseStatusCode = response.getStatus();
         log.error("responseStatusCode: {}, {}", responseStatusCode, HttpStatus.OK.value());
         if (responseStatusCode != HttpStatus.OK.value()) {
-            errorCode = (int)request.getAttribute(GlobalConstants.API_RESULT_CODE);
-            errorMessage = (String)request.getAttribute(GlobalConstants.API_RESULT_MESSAGE);
+            errorCode = GlobalConstants.getAttributeInt(request, GlobalConstants.API_RESULT_CODE);
+            errorMessage = GlobalConstants.getAttributeStr(request, GlobalConstants.API_RESULT_MESSAGE);
         }
 
+        String apiGuid = GlobalConstants.getApiGuid(request);
+        String apiKey = GlobalConstants.getApiKey(request);
         TbAipCallLog callLog = TbAipCallLog.builder()
                 .apiEndPoint(request.getRequestURI())
-                .apiGuid(GlobalConstants.getApiGuid(request))
-                .ipAddress((String)request.getAttribute(GlobalConstants.API_IP_ADDRESS))
-                .requestAt((LocalDateTime) request.getAttribute(GlobalConstants.API_START_TM))
+                .apiGuid(apiGuid)
+                .ipAddress(GlobalConstants.getAttributeStr(request, GlobalConstants.API_IP_ADDRESS))
+                .requestAt((LocalDateTime)request.getAttribute(GlobalConstants.API_START_TM))
                 .responseAt(LocalDateTime.now())
                 .responseStatusCode(responseStatusCode)
                 .errorCode(errorCode)
@@ -83,7 +87,38 @@ public class AipApiControllerInterceptor implements HandlerInterceptor {
                 .build();
         dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_API_CALL_LOG, false, callLog));
 
-        log.error("AipApiControllerInterceptor: afterCompletion ==> {}", request.getAttribute(GlobalConstants.API_GUID));
+        if (responseStatusCode == HttpStatus.OK.value()) {
+            int apiId = GlobalConstants.getApiId(request);
+            if ((apiId >= GlobalConstants.API_FILE_INFO && apiId <= GlobalConstants.API_FILE_DELETE_LABEL_PROTECTION) ||
+                (apiId >= GlobalConstants.API_STREAM_INFO || apiId <= GlobalConstants.API_STREAM_DELETE_LABEL_PROTECTION))
+            {
+                ResponseBase res = (ResponseBase)request.getAttribute(GlobalConstants.API_RESULT);
+                if (res != null) {
+                    TbAipFileJobLog fileJobLog = new TbAipFileJobLog(apiId, apiGuid, apiGuid, callLog.getIpAddress(), apiKey);
+                    fileJobLog.setDecryptKey(GlobalConstants.getAttributeStr(request, GlobalConstants.API_DECRYPT_KEY));
+                    fileJobLog.setJobOwner(GlobalConstants.getAttributeStr(request, GlobalConstants.API_JOB_OWNER));
+
+                    fileJobLog.setJobResult(res.getErrorCode());
+                    fileJobLog.setJobMessage(res.getErrorMessage());
+
+                    fileJobLog.setFileName(res.getDispFileName());
+                    fileJobLog.setFileOwner(res.getFileOwner());
+                    fileJobLog.setFileExt(res.getFileExt());
+                    fileJobLog.setFileSize(res.getFileSize());
+                    fileJobLog.setFileLabelGuid(res.getFileLabelGuid());
+                    fileJobLog.setFileProtectionGuid(res.getFileProtectionGuid());
+
+                    fileJobLog.setNewFileName(res.getNewFileName());
+                    fileJobLog.setNewFileOwner(res.getNewFileOwner());
+                    fileJobLog.setNewFileExt(res.getNewFileExt());
+                    fileJobLog.setNewFileSize(res.getNewFileSize());
+                    fileJobLog.setNewFileLabelGuid(res.getNewFileLabelGuid());
+                    fileJobLog.setNewFileProtectionGuid (res.getNewFileProtectionGuid());
+                    log.error("{}", fileJobLog);
+                    dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_AIP_FILE_JOB_LOG, false, fileJobLog));
+                }
+            }
+        }
     }
 
 }

+ 22 - 0
src/main/java/com/aip/gateway/api/model/app/CheckAip.java

@@ -0,0 +1,22 @@
+package com.aip.gateway.api.model.app;
+
+import lombok.Data;
+
+@Data
+public class CheckAip {
+    private int errorCode;
+    private String errorMessage;
+    private String dispFileName;
+    private String reqFileName;
+    private String newFileExt;
+    private String actualFileName;
+
+    public CheckAip(int errorCode, String errorMessage, String dispFileName) {
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        this.dispFileName = dispFileName;
+        this.reqFileName = "";
+        this.newFileExt = "";
+        this.actualFileName = "";
+    }
+}

+ 11 - 0
src/main/java/com/aip/gateway/api/model/file/FileNotFoundException.java

@@ -0,0 +1,11 @@
+package com.aip.gateway.api.model.file;
+
+public class FileNotFoundException extends RuntimeException {
+    public FileNotFoundException(String message) {
+        super(message);
+    }
+
+    public FileNotFoundException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 11 - 0
src/main/java/com/aip/gateway/api/model/file/FileStorageException.java

@@ -0,0 +1,11 @@
+package com.aip.gateway.api.model.file;
+
+public class FileStorageException extends RuntimeException {
+    public FileStorageException(String message) {
+        super(message);
+    }
+
+    public FileStorageException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 19 - 0
src/main/java/com/aip/gateway/api/model/file/UploadFileResponse.java

@@ -0,0 +1,19 @@
+package com.aip.gateway.api.model.file;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Getter
+@Setter
+@AllArgsConstructor
+public class UploadFileResponse {
+
+    private String fileName;
+    private String fileDownloadUri;
+    private String fileType;
+    private long size;
+
+}

+ 38 - 0
src/main/java/com/aip/gateway/api/model/response/ResponseBase.java

@@ -67,4 +67,42 @@ public class ResponseBase implements Serializable {
         this.newFileExt = newFileExt;
         this.newFileSize = newFileSize;
     }
+
+    public ResponseBase(int errorCode, String errorMessage, String dispFileName) {
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        this.dispFileName = dispFileName;
+        this.fileId = "";
+        this.fileName = "";
+        this.fileLabelGuid = "";
+        this.fileProtectionGuid = "";
+        this.fileOwner = "";
+        this.fileExt = "";
+        this.fileSize = 0;
+        this.newFileName = "";
+        this.newFileLabelGuid = "";
+        this.newFileProtectionGuid = "";
+        this.newFileOwner = "";
+        this.newFileExt = "";
+        this.newFileSize = 0;
+    }
+
+    public ResponseBase(ResponseBase baseData) {
+        this.errorCode = baseData.errorCode;
+        this.errorMessage = baseData.errorMessage;
+        this.dispFileName = baseData.dispFileName;
+        this.fileId = baseData.fileId;
+        this.fileName = baseData.fileName;
+        this.fileLabelGuid = baseData.fileLabelGuid;
+        this.fileProtectionGuid = baseData.fileProtectionGuid;
+        this.fileOwner = baseData.fileOwner;
+        this.fileExt = baseData.fileExt;
+        this.fileSize = baseData.fileSize;
+        this.newFileName = baseData.newFileName;
+        this.newFileLabelGuid = baseData.newFileLabelGuid;
+        this.newFileProtectionGuid = baseData.newFileProtectionGuid;
+        this.newFileOwner = baseData.newFileOwner;
+        this.newFileExt = baseData.newFileExt;
+        this.newFileSize = baseData.newFileSize;
+    }
 }

+ 7 - 2
src/main/java/com/aip/gateway/api/model/response/ResponseFile.java

@@ -17,8 +17,13 @@ public class ResponseFile extends ResponseBase {
 
     private String outputFileName;
 
-    public ResponseFile(int errorCode, String errorMessage) {
-        super(errorCode, errorMessage, "", "", "", "", "", "", "", 0, "", "", "", "", "", 0);
+    public ResponseFile(int errorCode, String errorMessage, String dispFileName) {
+        super(errorCode, errorMessage, dispFileName);
         outputFileName = "";
     }
+    public ResponseFile(ResponseBase baseResponse) {
+        super(baseResponse);
+        outputFileName = "";
+    }
+
 }

+ 8 - 2
src/main/java/com/aip/gateway/api/model/response/ResponseStream.java

@@ -25,8 +25,14 @@ public class ResponseStream extends ResponseBase {
     @JsonIgnore
     private String outputFileName;
 
-    public ResponseStream(int errorCode, String errorMessage) {
-        super(errorCode, errorMessage, "", "", "", "", "", "", "", 0, "", "", "", "", "", 0);
+    public ResponseStream(int errorCode, String errorMessage, String dispFileName) {
+        super(errorCode, errorMessage, dispFileName);
+
+        fileData = null;
+        outputFileName = "";
+    }
+    public ResponseStream(ResponseBase baseResponse) {
+        super(baseResponse);
         fileData = null;
         outputFileName = "";
     }

+ 0 - 1
src/main/java/com/aip/gateway/api/process/DbmsDataType.java

@@ -3,7 +3,6 @@ package com.aip.gateway.api.process;
 public enum DbmsDataType {
 
     DBMS_DATA_API_CALL_LOG,
-
     DBMS_DATA_AIP_FILE_JOB_LOG,
 
 }

+ 28 - 0
src/main/java/com/aip/gateway/api/repository/GlobalConstants.java

@@ -15,6 +15,8 @@ public class GlobalConstants {
     public static final String API_GUID = "api-guid";
     public static final String API_ID = "api-id";
     public static final String API_KEY = "api-key";
+    public static final String API_DECRYPT_KEY = "api-decrypt-key";
+    public static final String API_JOB_OWNER = "api-job-owner";
     public static final String API_RESULT_CODE = "api-result-code";
     public static final String API_RESULT_MESSAGE = "api-result-message";
     public static final String API_REQUEST = "api-request";
@@ -70,6 +72,9 @@ public class GlobalConstants {
         request.setAttribute(GlobalConstants.API_ID, apiId);
         request.setAttribute(GlobalConstants.API_KEY, apiKey);
         if (req != null) {
+            request.setAttribute(GlobalConstants.API_KEY, apiKey);
+            request.setAttribute(GlobalConstants.API_DECRYPT_KEY, req.getDecryptKey());
+            request.setAttribute(GlobalConstants.API_JOB_OWNER, req.getEmail());
             req.setApiGuid(getApiGuid(request));
         }
     }
@@ -81,6 +86,29 @@ public class GlobalConstants {
         }
         return apiId;
     }
+
+    public static String getAttributeStr(HttpServletRequest request, String attribute) {
+        String value = (String)request.getAttribute(attribute);
+        if (value == null) {
+            return "";
+        }
+        return value;
+    }
+    public static int getAttributeInt(HttpServletRequest request, String attribute) {
+        Integer value = (Integer)request.getAttribute(attribute);
+        if (value == null) {
+            return 0;
+        }
+        return value;
+    }
+    public static long getAttributeLong(HttpServletRequest request, String attribute) {
+        Long value = (Long)request.getAttribute(attribute);
+        if (null == value) {
+            return 0;
+        }
+        return value;
+    }
+
     public static String getApiKey(HttpServletRequest request) {
         String apiKey = (String)request.getAttribute(API_KEY);
         if (apiKey == null) {

+ 73 - 0
src/main/java/com/aip/gateway/api/service/FileStorageService.java

@@ -0,0 +1,73 @@
+package com.aip.gateway.api.service;
+
+import com.aip.gateway.api.config.FileStorageConfig;
+import com.aip.gateway.api.model.file.FileNotFoundException;
+import com.aip.gateway.api.model.file.FileStorageException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.UrlResource;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class FileStorageService {
+
+    private final FileStorageConfig config;
+    private final Path fileStorageLocation;
+
+    public FileStorageService(FileStorageConfig config) {
+        this.config = config;
+        this.fileStorageLocation = Paths.get(config.getUploadDir()) .toAbsolutePath().normalize();
+
+        try {
+            Files.createDirectories(this.fileStorageLocation);
+        } catch (Exception ex) {
+            log.error("init: {}", ex.getMessage());
+            throw new FileStorageException("Could not create the directory where the uploaded files will be stored.", ex);
+        }
+    }
+
+    public String storeFile(MultipartFile file) {
+        // Normalize file name
+        String fileName = StringUtils.cleanPath(Objects.requireNonNull(file.getOriginalFilename()));
+
+        try {
+            // Check if the file's name contains invalid characters
+            if(fileName.contains("..")) {
+                throw new FileStorageException("Sorry! Filename contains invalid path sequence " + fileName);
+            }
+
+            // Copy file to the target location (Replacing existing file with the same name)
+            Path targetLocation = this.fileStorageLocation.resolve(fileName);
+            Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
+
+            return fileName;
+        } catch (IOException ex) {
+            throw new FileStorageException("Could not store file " + fileName + ". Please try again!", ex);
+        }
+    }
+
+    public Resource loadFileAsResource(String fileName) {
+        try {
+            Path filePath = this.fileStorageLocation.resolve(fileName).normalize();
+            Resource resource = new UrlResource(filePath.toUri());
+            if(resource.exists()) {
+                return resource;
+            } else {
+                throw new FileNotFoundException("File not found " + fileName);
+            }
+        } catch (MalformedURLException ex) {
+            throw new FileNotFoundException("File not found " + fileName, ex);
+        }
+    }
+}

+ 84 - 2
src/main/java/com/aip/gateway/api/service/impl/AbstractAipService.java

@@ -1,10 +1,15 @@
 package com.aip.gateway.api.service.impl;
 
 import com.aip.gateway.api.aip.model.AipFileInfo;
+import com.aip.gateway.api.aip.model.SetFileInfo;
+import com.aip.gateway.api.aip.utils.AipFileUtils;
+import com.aip.gateway.api.model.app.CheckAip;
+import com.aip.gateway.api.model.response.ResponseBase;
+import com.aip.gateway.api.model.response.ResponseFile;
 import com.aip.gateway.api.model.response.ResponseInfo;
+import com.aip.gateway.api.model.response.ResponseStream;
 import com.aip.gateway.api.repository.AipFileRepository;
 import com.aip.gateway.api.repository.AppRepository;
-import com.aip.gateway.api.aip.utils.AipFileUtils;
 import com.aip.gateway.api.utils.TimeUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -29,7 +34,84 @@ abstract class AbstractAipService {
         return this.repo.getSupportedFileType(reqFileName);
     }
 
+    protected CheckAip checkAipRequest(String apiGuid, String dispFileName, String realFileName, boolean isStream) {
+        String reqFileName = "";
+        if (isStream) {
+            reqFileName = getRequestFileName(apiGuid + AipFileUtils.getExtension(dispFileName));
+        }
+        else {
+            reqFileName = getRequestFileName(realFileName);
+            if (!AipFileUtils.isExists(reqFileName)) {
+                return new CheckAip(101, "파일이 존재하지 않습니다.", dispFileName);
+            }
+        }
+        String newFileExt = getSupportedFileType(reqFileName);
+        if (newFileExt == null) {
+            return new CheckAip(102, "지원하지 않는 파일형식 입니다.", dispFileName);
+        }
+
+        CheckAip result = new CheckAip(0, "Success", dispFileName);
+        result.setReqFileName(reqFileName);
+        result.setNewFileExt(newFileExt);
+        if (isStream) {
+            result.setDispFileName(AipFileUtils.getFileNameWithoutExtension(dispFileName) + newFileExt);
+        }
+        else {
+            result.setDispFileName(AipFileUtils.getFileNameWithoutExtension(realFileName) + newFileExt);
+        }
+        result.setActualFileName(getActualFileName(apiGuid + newFileExt));
+        return result;
+    }
+
+    protected ResponseFile responseFileException(Exception exception, String displayFileName) {
+        log.error("responseFileException: {}", exception.getMessage());
+        return new ResponseFile(109, "작업 중에 시스템 오류가 발생했습니다.", displayFileName);
+    }
+    protected ResponseStream responseStreamException(Exception exception, String displayFileName) {
+        log.error("responseFileException: {}", exception.getMessage());
+        return new ResponseStream(109, "작업 중에 시스템 오류가 발생했습니다.", displayFileName);
+    }
+
+    private ResponseBase responseBase(SetFileInfo fileInfo, String displayFileName, String actualFileName) {
+        ResponseBase result = new ResponseBase(fileInfo.errorNo, fileInfo.errorMsg, displayFileName);
+        result.setFileExt(AipFileUtils.getExtension(displayFileName));
+        result.setFileOwner(fileInfo.fileOwner);
+        result.setFileSize(fileInfo.fileSize);
+        result.setFileLabelGuid(fileInfo.labelGuid);
+        result.setFileProtectionGuid(fileInfo.templateGuid);
+        result.setNewFileName(displayFileName);
+        result.setNewFileOwner(fileInfo.newFileOwner);
+        result.setNewFileExt(AipFileUtils.getExtension(actualFileName));
+        result.setNewFileSize(fileInfo.newFileSize);
+        result.setNewFileLabelGuid(fileInfo.newFileLabelGuid);
+        result.setNewFileProtectionGuid(fileInfo.newFileTemplateGuid);
+        return result;
+    }
+    protected ResponseFile responseSetFile(SetFileInfo fileInfo, String displayFileName, String actualFileName) {
+        ResponseBase baseResponse = responseBase(fileInfo, displayFileName, actualFileName);
+        ResponseFile result = new ResponseFile(baseResponse);
+        result.setOutputFileName(AipFileUtils.getFileName(actualFileName));
+        return result;
+    }
+    protected ResponseStream responseSetStream(SetFileInfo fileInfo, String displayFileName, String actualFileName) {
+        ResponseBase baseResponse = responseBase(fileInfo, displayFileName, actualFileName);
+        ResponseStream result = new ResponseStream(baseResponse);
+        result.setOutputFileName(AipFileUtils.getFileName(actualFileName));
+        result.setFileData(AipFileUtils.getFileDataString(actualFileName));
+        return result;
+    }
+
+    protected ResponseStream responseStreamFail(String displayFileName) {
+        log.error("responseStreamFail: {}", displayFileName);
+        return new ResponseStream(110, "작업 중에 파일 시스템 오류가 발생했습니다.", displayFileName);
+    }
+    protected ResponseInfo responseInfoException(Exception exception) {
+        log.error("responseInfoException: {}", exception.getMessage());
+        return new ResponseInfo(109, "작업 중에 시스템 오류가 발생했습니다.");
+    }
+
     protected ResponseInfo responseGetFileInfo(AipFileInfo fileInfo, String displayFileName) {
+        log.error("{}", fileInfo);
         boolean isLabled = false;
         boolean isProtected = false;
         Date creationTime = TimeUtils.getCurrentDate();
@@ -60,7 +142,7 @@ abstract class AbstractAipService {
                 }
             }
         }
-        ResponseInfo result = new ResponseInfo(0, "success");
+        ResponseInfo result = new ResponseInfo(0, "Success");
         result.setLabeled(isLabled);
         result.setProtected(isProtected);
         result.setCreationTime(creationTime);

+ 1 - 1
src/main/java/com/aip/gateway/api/service/impl/ApiDbService.java

@@ -141,7 +141,7 @@ public class ApiDbService implements IApiDbService {
         initLinkedDecryptKeys();
         return GeneralResponse.builder()
                 .errorCode(0)
-                .errorMessage("success")
+                .errorMessage("Success")
                 .effectCount(this.appRepo.getApiKeyMap().size() + this.appRepo.getDecryptKeyMap().size())
                 .build();
     }

+ 70 - 8
src/main/java/com/aip/gateway/api/service/impl/ApiFileService.java

@@ -1,5 +1,8 @@
 package com.aip.gateway.api.service.impl;
 
+import com.aip.gateway.api.aip.model.SetFileInfo;
+import com.aip.gateway.api.aip.utils.AipFileUtils;
+import com.aip.gateway.api.model.app.CheckAip;
 import com.aip.gateway.api.model.request.RequestFile;
 import com.aip.gateway.api.model.request.RequestFileAllSet;
 import com.aip.gateway.api.model.request.RequestFileDel;
@@ -9,7 +12,6 @@ import com.aip.gateway.api.model.response.ResponseInfo;
 import com.aip.gateway.api.repository.AipFileRepository;
 import com.aip.gateway.api.repository.AppRepository;
 import com.aip.gateway.api.service.IApiFileService;
-import com.aip.gateway.api.aip.utils.AipFileUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -35,37 +37,97 @@ public class ApiFileService extends AbstractAipService implements IApiFileServic
             return responseGetFileInfo(this.aipFile.getManager().getFileInfo(reqFileName), req.getDispFileName());
         }
         catch (Exception e) {
-            return new ResponseInfo(109, "작업 중에 시스템 오류가 발생했습니다.");
+            return responseInfoException(e);
         }
     }
 
     @Override
     public ResponseFile setLabel(RequestFileSet req) {
-        return null;
+        try {
+            CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), req.getRealFileName(), false);
+            if (check.getErrorCode() != 0) {
+                return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+            }
+            SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), "", req.getComment());
+            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+        }
+        catch (Exception e) {
+            return responseFileException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseFile delLabel(RequestFileDel req) {
-        return null;
+        try {
+            CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), req.getRealFileName(), false);
+            if (check.getErrorCode() != 0) {
+                return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+            }
+            SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), false);
+            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+        }
+        catch (Exception e) {
+            return responseFileException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseFile setProtection(RequestFileSet req) {
-        return null;
+        try {
+            CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), req.getRealFileName(), false);
+            if (check.getErrorCode() != 0) {
+                return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+            }
+            SetFileInfo result = this.aipFile.getManager().setProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), req.getComment());
+            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+        }
+        catch (Exception e) {
+            return responseFileException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseFile delProtection(RequestFileDel req) {
-        return null;
+        try {
+            CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), req.getRealFileName(), false);
+            if (check.getErrorCode() != 0) {
+                return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+            }
+            SetFileInfo result = this.aipFile.getManager().deleteProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment());
+            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+        }
+        catch (Exception e) {
+            return responseFileException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseFile setLabelProtection(RequestFileAllSet req) {
-        return null;
+        try {
+            CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), req.getRealFileName(), false);
+            if (check.getErrorCode() != 0) {
+                return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+            }
+            SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getLabelGuid(), req.getTemplateGuid(), req.getComment());
+            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+        }
+        catch (Exception e) {
+            return responseFileException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseFile delLabelProtection(RequestFileDel req) {
-        return null;
+        try {
+            CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), req.getRealFileName(), false);
+            if (check.getErrorCode() != 0) {
+                return new ResponseFile(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+            }
+            SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), true);
+            return responseSetFile(result, req.getDispFileName(), check.getActualFileName());
+        }
+        catch (Exception e) {
+            return responseFileException(e, req.getDispFileName());
+        }
     }
 }

+ 147 - 15
src/main/java/com/aip/gateway/api/service/impl/ApiStreamService.java

@@ -1,7 +1,8 @@
 package com.aip.gateway.api.service.impl;
 
-import com.aip.gateway.api.aip.utils.AipFileStream;
+import com.aip.gateway.api.aip.model.SetFileInfo;
 import com.aip.gateway.api.aip.utils.AipFileUtils;
+import com.aip.gateway.api.model.app.CheckAip;
 import com.aip.gateway.api.model.request.RequestStream;
 import com.aip.gateway.api.model.request.RequestStreamAllSet;
 import com.aip.gateway.api.model.request.RequestStreamDel;
@@ -27,53 +28,184 @@ public class ApiStreamService extends AbstractAipService implements IApiStreamSe
     @Override
     public ResponseInfo getInfo(RequestStream req) {
         try {
-            String tempOrgFileName = getRequestFileName(AipFileUtils.getFileNameWithoutExtension(req.getDispFileName()) + AipFileUtils.getExtension(req.getDispFileName()));
+            String tempOrgFileName = getRequestFileName(req.getApiGuid() + AipFileUtils.getExtension(req.getDispFileName()));
             String actualFileName = getActualFileName(req.getApiGuid() + AipFileUtils.getExtension(req.getDispFileName()));
             String newFileExt = getSupportedFileType(req.getDispFileName());
             if (newFileExt == null) {
                 return new ResponseInfo(102, "지원하지 않는 파일형식 입니다.");
             }
-            log.error("{}", tempOrgFileName);
-            log.error("{}", actualFileName);
 
             byte[] fileDataArr = Base64.getDecoder().decode(req.getFileData());
-            AipFileUtils.streamToFile(fileDataArr, tempOrgFileName);
-
-            AipFileStream fileStream = new AipFileStream(req.getFileData());
-            return responseGetFileInfo(this.aipFile.getManager().getFileInfo(fileStream, actualFileName), req.getDispFileName());
+            if (!AipFileUtils.streamToFile(fileDataArr, tempOrgFileName)) {
+                return new ResponseInfo(110, "작업 중에 파일 시스템 오류가 발생했습니다.");
+            }
+            try {
+                return responseGetFileInfo(this.aipFile.getManager().getFileInfo(tempOrgFileName, actualFileName), req.getDispFileName());
+            }
+            finally {
+                AipFileUtils.delete(tempOrgFileName);
+            }
+            //AipFileStream fileStream = new AipFileStream(req.getFileData());
+            //return responseGetFileInfo(this.aipFile.getManager().getFileInfo(fileStream, actualFileName), req.getDispFileName());
         }
         catch (Exception e) {
-            return new ResponseInfo(109, "작업 중에 시스템 오류가 발생했습니다.");
+            return responseInfoException(e);
         }
     }
 
     @Override
     public ResponseStream setLabel(RequestStreamSet req) {
-        return null;
+        CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), "", true);
+        if (check.getErrorCode() != 0) {
+            return new ResponseStream(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+        }
+        try {
+            byte[] fileDataArr = Base64.getDecoder().decode(req.getFileData());
+            if (!AipFileUtils.streamToFile(fileDataArr, check.getReqFileName())) {
+                return responseStreamFail(req.getDispFileName());
+            }
+
+            try {
+                SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), "", req.getComment());
+                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+            }
+            finally {
+                AipFileUtils.delete(check.getReqFileName());
+                AipFileUtils.delete(check.getActualFileName());
+            }
+        }
+        catch (Exception e) {
+            return responseStreamException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseStream delLabel(RequestStreamDel req) {
-        return null;
+        CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), "", true);
+        if (check.getErrorCode() != 0) {
+            return new ResponseStream(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+        }
+        try {
+            byte[] fileDataArr = Base64.getDecoder().decode(req.getFileData());
+            if (!AipFileUtils.streamToFile(fileDataArr, check.getReqFileName())) {
+                return responseStreamFail(req.getDispFileName());
+            }
+
+            try {
+                SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), false);
+                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+            }
+            finally {
+                AipFileUtils.delete(check.getReqFileName());
+                AipFileUtils.delete(check.getActualFileName());
+            }
+        }
+        catch (Exception e) {
+            return responseStreamException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseStream setProtection(RequestStreamSet req) {
-        return null;
+        CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), "", true);
+        if (check.getErrorCode() != 0) {
+            return new ResponseStream(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+        }
+        try {
+            byte[] fileDataArr = Base64.getDecoder().decode(req.getFileData());
+            if (!AipFileUtils.streamToFile(fileDataArr, check.getReqFileName())) {
+                return responseStreamFail(req.getDispFileName());
+            }
+
+            try {
+                SetFileInfo result = this.aipFile.getManager().setProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getAipGuid(), req.getComment());
+                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+            }
+            finally {
+                AipFileUtils.delete(check.getReqFileName());
+                AipFileUtils.delete(check.getActualFileName());
+            }
+        }
+        catch (Exception e) {
+            return responseStreamException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseStream delProtection(RequestStreamDel req) {
-        return null;
+        CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), "", true);
+        if (check.getErrorCode() != 0) {
+            return new ResponseStream(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+        }
+        try {
+            byte[] fileDataArr = Base64.getDecoder().decode(req.getFileData());
+            if (!AipFileUtils.streamToFile(fileDataArr, check.getReqFileName())) {
+                return responseStreamFail(req.getDispFileName());
+            }
+
+            try {
+                SetFileInfo result = this.aipFile.getManager().deleteProtection(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment());
+                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+            }
+            finally {
+                AipFileUtils.delete(check.getReqFileName());
+                AipFileUtils.delete(check.getActualFileName());
+            }
+        }
+        catch (Exception e) {
+            return responseStreamException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseStream setLabelProtection(RequestStreamAllSet req) {
-        return null;
+        CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), "", true);
+        if (check.getErrorCode() != 0) {
+            return new ResponseStream(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+        }
+        try {
+            byte[] fileDataArr = Base64.getDecoder().decode(req.getFileData());
+            if (!AipFileUtils.streamToFile(fileDataArr, check.getReqFileName())) {
+                return responseStreamFail(req.getDispFileName());
+            }
+
+            try {
+                SetFileInfo result = this.aipFile.getManager().setLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getLabelGuid(), req.getTemplateGuid(), req.getComment());
+                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+            }
+            finally {
+                AipFileUtils.delete(check.getReqFileName());
+                AipFileUtils.delete(check.getActualFileName());
+            }
+        }
+        catch (Exception e) {
+            return responseStreamException(e, req.getDispFileName());
+        }
     }
 
     @Override
     public ResponseStream delLabelProtection(RequestStreamDel req) {
-        return null;
+        CheckAip check = checkAipRequest(req.getApiGuid(), req.getDispFileName(), "", true);
+        if (check.getErrorCode() != 0) {
+            return new ResponseStream(check.getErrorCode(), check.getErrorMessage(), check.getDispFileName());
+        }
+        try {
+            byte[] fileDataArr = Base64.getDecoder().decode(req.getFileData());
+            if (!AipFileUtils.streamToFile(fileDataArr, check.getReqFileName())) {
+                return responseStreamFail(req.getDispFileName());
+            }
+
+            try {
+                SetFileInfo result = this.aipFile.getManager().deleteLabel(check.getReqFileName(), check.getActualFileName(), req.getEmail(), req.getComment(), true);
+                return responseSetStream(result, req.getDispFileName(), check.getActualFileName());
+            }
+            finally {
+                AipFileUtils.delete(check.getReqFileName());
+                AipFileUtils.delete(check.getActualFileName());
+            }
+        }
+        catch (Exception e) {
+            return responseStreamException(e, req.getDispFileName());
+        }
     }
 }

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

@@ -13,7 +13,12 @@ spring:
   #  import: file:${user.dir}/conf/application.yml
   #profiles:
   #  include: application
-
+  servlet:
+    multipart:
+      enabled: true
+      file-size-threshold: 5MB
+      max-file-size: 500MB
+      max-request-size: 500MB
   datasource:
     hikari:
       driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
@@ -32,6 +37,9 @@ spring:
       connection-timeout: 10000
       pool-name: pool-aip-gateway-api-server
 
+file:
+  upload-dir: c:\\data\\target
+
 logging:
   level:
     org.hibernate.SQL: info
@@ -49,6 +57,7 @@ server:
   servlet:
     session:
       timeout: 300
+      tracking-modes: cookie
 
 application:
   aip-server-id: 0

+ 1 - 1
src/main/resources/mybatis/mapper/BaseDbMapper.xml

@@ -117,7 +117,7 @@
 
     <insert id="insertAipFileJobLog" parameterType="com.aip.gateway.api.entity.TbAipFileJobLog">
     <![CDATA[
-        INSERT INTO TB_AIP_API_CALL_LOG (
+        INSERT INTO TB_AIP_FILE_JOB_LOG (
             ApiId,
             FileId,
             FileName,

Some files were not shown because too many files changed in this diff