eunja511005 / AutoCoding

0 stars 0 forks source link

:new: File Upload API 만들기 #133

Open eunja511005 opened 10 months ago

eunja511005 commented 10 months 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 10 months ago

1. 토큰 얻어 오기

image

 

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

image

eunja511005 commented 10 months 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 10 months ago

테스트

image