eunja511005 / AutoCoding

0 stars 0 forks source link

:new: File Upload API 만들기 #133

Open eunja511005 opened 1 year ago

eunja511005 commented 1 year ago
  1. 여러개 파일 업로드 가능

  2. 토큰을 이용하여 인증 체크

  3. 토큰에서 업로드하는 유저 이름 얻기

  4. 업로드 성공시 ZTHH_FILE_ATTACH 테이블에 저장

  5. ImageController.java 파일

    @PostMapping("/image/upload")
    public @ResponseBody ApiResponse<Map<String, Object>> saveUserManage(@RequestHeader("Authorization") String token,
            MultipartHttpServletRequest multipartFiles) throws IOException {
    
        String authToken = token.substring(7); // "Bearer " 이후의 토큰 부분 추출
        log.info(authToken);
    
        Map<String, Object> res;
        if (JwtTokenUtil.validateToken(authToken)) {// 토큰이 유효한 경우 
    
            String username = JwtTokenUtil.extractUsername(authToken);
            res = fileUtil.saveImageWithTable(multipartFiles, username);
    
        } else {
            // 토큰이 유효하지 않은 경우 예외 처리
            throw new IllegalArgumentException("Invalid token");
        }
    
        return new ApiResponse<>(true, "Success save", res);
    }
  6. FileUtil.java 파일

    public Map<String, Object> saveImageWithTable(MultipartHttpServletRequest multipartFiles, String creator) throws IOException {
        Map<String, Object> res = new HashMap<>();
    
        Iterator<String> fileNames = multipartFiles.getFileNames();
        String fileName = "";
        String mediaTypeString = "";
        int seq = 0;
        while (fileNames.hasNext()) {
                fileName = fileNames.next();
                log.info("requestFile {} ", fileName);
                List<MultipartFile> multipartFilesList = multipartFiles.getFiles(fileName);
                UUID uuid = UUID.randomUUID();
                String attachId = "user_attach_"+uuid;
                for (MultipartFile multipartFile : multipartFilesList) {
                    seq++;
                    LocalDateTime now = LocalDateTime.now();
                    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
                    String current_date = now.format(dateTimeFormatter);
    
                    String originalFileExtension;
                    String contentType = multipartFile.getContentType();
                    if (ObjectUtils.isEmpty(contentType)) {
                        res.put("result", "Could not upload the file: " + multipartFile.getOriginalFilename() + "!");
                        return res;
                    } else {
                        String mimeType = new Tika().detect(multipartFile.getInputStream()); //where 'file' is a File object or InputStream of the uploaded file
                        MediaType mediaType = MediaType.parse(mimeType);
                        mediaTypeString = mediaType.getType() + "/" + mediaType.getSubtype();
    
                        if(!mediaTypeString.equals("image/jpeg") && !mediaTypeString.equals("image/png") && !mediaTypeString.equals("image/gif")) {
                            res.put("result", "You can upload file's media type of image/jpeg, image/png");
                            return res;
                        }
                        log.info("tikaMimeType {} : "+mimeType);
                        originalFileExtension = MimeTypeUtils.parseMimeType(mimeType).getSubtype();
                        originalFileExtension = "."+originalFileExtension;
                        log.info("originalFileExtension {} : "+originalFileExtension);
                    }
                    String new_file_name = current_date + "/" + System.nanoTime() + originalFileExtension;
                    File newFile = new File(multiPathPath + new_file_name);
                    if (!newFile.exists()) {
                        boolean wasSuccessful = newFile.mkdirs();
                    }
    
                    multipartFile.transferTo(newFile);
    
                    log.info("Uploaded the file successfully: " + multipartFile.getOriginalFilename());
                    log.info("new file name: " + new_file_name);
    
                    ZthhFileAttachDTO zthhFileAttachDTO = ZthhFileAttachDTO.builder()
                                                                        .attachId(attachId)
                                                                        .sequence(seq)
                                                                        .originalFileName(multipartFile.getOriginalFilename())
                                                                        .fileName(new_file_name)
                                                                        .fileType(mediaTypeString)
                                                                        .fileSize(multipartFile.getSize())
                                                                        .filePath(multiPathPath + new_file_name)
                                                                        .createId(creator)
                                                                        .updateId(creator)
                                                                        .build();
    
                    zthhFileAttachService.save(zthhFileAttachDTO);
                }
    
        }
    
        // 임시 파일 지우기
        File dir = new File(multiPathPath);
        for (File file : dir.listFiles()) {
            if (file.isFile() && file.getName().toLowerCase().endsWith(".tmp")) {
                file.delete();
            }
        }
    
        return res;
    }
eunja511005 commented 1 year ago

1. 토큰 얻어 오기

image

 

2. 토큰을 이용하여 업로드 API 호출 하기

image

eunja511005 commented 1 year ago

파일 다운로드

1. 이미지를 보여 주기 위해 URL을 이용하지 않고, 파일 내용을 byte[] 형태로 리턴
2. 안드로이드 앱에서 파일 내용을 받을 때는 일단 String으로 받고 Base64 디코딩 하면 정상적으로 보임
    @PostMapping("/image/lists")
    public @ResponseBody ApiResponse<List<ImageResponseDTO>> getProjectList(@RequestHeader("Authorization") String token,
            @RequestBody ImageRequestDTO imageRequestDTO) throws IOException {

        String authToken = token.substring(7); // "Bearer " 이후의 토큰 부분 추출
        if (JwtTokenUtil.validateToken(authToken)) {// 토큰이 유효한 경우 
            String username = JwtTokenUtil.extractUsername(authToken);
            List<ImageResponseDTO> imageResponseDTOList = zthhFileAttachService.getFiles(imageRequestDTO, username);
            return new ApiResponse<>(true, "Success save", imageResponseDTOList);
        } else {
            // 토큰이 유효하지 않은 경우 예외 처리
            throw new IllegalArgumentException("Invalid token");
        }

    }

image

eunja511005 commented 1 year ago

테스트

image