본문 바로가기
Web

Form 에 FormData 와 File 을 동시에 받아 Java 로 처리하기

by 19810721 2020. 3. 22.

지난 번에 이어서 이번에는 ajax  보낸 File 이 첨부된 Form 을 Java 에서 처리해보자.

 

환경은 자바 8, JPA, 스프링부트 2

    @PostMapping(value = "/sinmungowriteForm")
    public ResponseEntity<ApiResponseVo> sinmungowriteForm(
        Model model, SinmungoWriteCommand sinmungoWriteCommand) {
        
        // blah blah 
        
        
        }
    }

 

우선 File 이 첨부되어 오니 당연하게도 @PostMapping 을 써야 한다. 그리고 유심히 봐야 할 부분은 @RequestParam("fileAttach") MultipartFile multipartFile 을 쓰지 않아도 된다는 점이다.

이는 VO 객체에 이미 private MultipartFile fileAttach; 을 두었기 때문이며 이는 VO 객체가 일반 Form 의 요소들과 name 이 일치하는 File 첨부도 함께 받아 주는 것을 의미한다.

 

        // file 처리
        if (!sinmungoWriteCommand.getFileAttach().isEmpty()) {
            AttachFile attachFile = fileUtilService
                .fileUpload(sinmungoWriteCommand.getFileAttach(), "sinmungowriteForm");
            // attachFile 의 id 를 DB 에 저장.
            log.debug(attachFile.getAttachFileId().toString());
            sinmungoWriteCommand.setAttachFileId(attachFile.getAttachFileId());
        }

 

 

파일 업로드가 필요한 부분에서 매번 써줄 수 없어서 별도의 FileUpload 클래스 컴포넌트를 만들어서 공통으로 사용하기로 하였다. 아래가 해당 클래스의 내용이며, multipartFile와 해당 파일의 특성을 나타낼 수 있는 스트링 문자열을 전달해주면, 실제 파일을 저장하고 저장이 성공하면 파일의 내용을 DB 에 저장하는 단계까지 나타낸다. 

    public AttachFile fileUpload(MultipartFile multipartFile, String name) {

        // 항목 인출
        log.debug("Uploading.. {}", name + " / " + multipartFile.getOriginalFilename());
        // upload
        String url = null;
        try {

            // 파일 정보
            String originFilename = multipartFile.getOriginalFilename();
            String extName = originFilename.substring(originFilename.lastIndexOf("."), originFilename.length());
            Long size = multipartFile.getSize();

            // 서버에서 저장 할 파일 이름
            String saveFileName = genSaveFileName(extName);

            // 저장
            boolean fileSaveYn = writeFile(multipartFile, saveFileName);

            if (fileSaveYn) {
                throw new Exception("Error on File Writing..");
            }

            url = PREFIX_URL + saveFileName;

            AttachFile attachFile = AttachFile.builder().category(name).fileTitle(originFilename).fileType(extName)
                .fileContent(name)
                .filePhysicalPath(PREFIX_URL).filePhysicalName(saveFileName).fileSize(size).deleteFlag("N")
                .fileLogicalName(originFilename)
                .createdUser(UserInfo.getSystemUser())
                .lastModifiedUser(UserInfo.getSystemUser())
                .build();

            AttachFile attachFileRst = attachFileRepository.save(attachFile);

            return attachFileRst;

        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static String genSaveFileName(String extName) {
        String fileName = "";

        // blah blah
        // file 이름이 중복되지 않도록 유니크한 문자열로 String 을 만들어준다.

        return fileName;
    }

    // 파일을 실제로 write 하는 메서드
    private static boolean writeFile(MultipartFile multipartFile, String saveFileName)
        throws IOException {
        boolean result = false;

        byte[] data = multipartFile.getBytes();
        FileOutputStream fos = new FileOutputStream(path + "/" + saveFileName);
        fos.write(data);
        fos.close();

        return result;
    }

 

fileUpload(MultipartFile multipartFile, String name); 를 호출한 입장에서는 File 에 대한 상세정보를 가진 VO 객체를 리턴 받아 적절히 활용하면 된다. 파일의 물리적 위치, 이름, 논리명, 사이즈 등의 데이터를 MultipartFile 인스턴스로부터 얻어서 저장하면 VO 만들기는 크게 어렵지 않다.

 

너무나 간단하게 웹에서 파일을 전송하는 방법을 만들어 놓고 테스트 삼아서 파일을 업로드 해보는데, 순식간에 파일이 서버 측에 전달되어 저장되는 것을 보면서 뭔가 생각만 해두고 있던 다른 기능을 만들어 보고 싶어졌다.

 

대용량 첨부파일을 외부에서 어디로 급하게 보내야 할 때 ㅎㅎ 개인이 운영하는 WAS 에 전송하고 단순하게 URL 만 전달할 수 있게 하는 초간단 서비스 ? ㅎㅎ , 나중에 만들어봐야겠다.

 

일단 이렇게 해서 업로드가 되었으니, 다음엔 DB 에 저장된 자료의 키를 던져주면 해당 키를 가진 실제 물리 파일을 웹에서 클라이언트로 슝 ~~ 보내주는 기능에 대해서 설명하고자 한다. 금일 아침에 급하게 구현한거라 아직 정리가 덜 되었는데, 다운로드도 되고 Web 에서 Static Resources 로 활용이 가능하다는 것을 테스트 했으니 곧 정리하여 올리도록 하겠다.

자전거 타기 참 좋은 날씨다.

 

 

 

 

 

 

'Web' 카테고리의 다른 글

자바 웹, 파일 다운로드 구현  (0) 2020.03.28
ajax 로 Form 전송시 첨부파일과 함께 보내기  (0) 2020.03.21