[SPRING]업로드 결과 반환과 화면처리-(2)

18427 단어 MultipartMultipart

정상적인 사이즈의 이미지 파일이라면 업로드가 처리되지만 아직 브루우저에는 아무런 결과가 반영되지 않았습니다.
결과 데이터는 JSON으로 전송할 것이므로 어떤구조의 데이터를 전송할 것인지 결정해야 합니다.

  • 브라우저에서 필요한 정보
    -업로드된 파일의 원래이름
    -파일의 UUID 값
    -업로드된 파일의 저장 경로

  • 위의 정보는 UploadController에서 파일을 저장할 때 만들어진 하나의 문자열로도 처리가 가능하지만 브라우저에서 처리가 간단할 수 있도록 클래스와 객체를 구성해서 처리해줍니다.

  • 프로젝트 내에 dto 패키지를 구성하고 UploadResultDTO 클래스를 작성합니다.

@Data
@AllArgsConstructor
public class UploadResultDTO implements Serializable {
    //implements Serializable을 하는 이유: 자바 시스템 내부에서 사용되는 Object 또는 Data를 
    // 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술로써,
    //JVM 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술입니다.(직렬화)

    private String fileName;

    private String uuid;

    private String folderPath;

    public String getImageURL(){    //추후에 전체 경로가 필요한 경우를 대비하여 생성
        try{
            return URLEncoder.encode(folderPath+"/"+uuid+"_"+fileName,"UTF-8");
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }
        return "";
    }
}

자바 URLEncoding

  • 웹 개발을 하다보면 URL 관련하여 인코딩이 필요한 경우가 있습니다.
  • URL에는 여러가지 규칙이 있고 그 규칙에 사용되는 문자들이 정해져있기 때문에 특정한 값들은 규칙에 맞게 변환되어야 합니다.
  • 또는 쿠키와 같이 한글을 표현하지 못하는 경우 한글을 ASCII값으로 인코딩해주야 합니다.
    이럴때는 다음과 같이 URLEncoder 클래스와 URLDecoder 클래스를 사용하면 됩니다.
Encoder
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
 
public class URLEncodeTest {
    public static void main(String[] args) {
        String url = null;
        try {
            url = URLEncoder.encode("한글 인코딩", "UTF-8");//URLEncoder는 밑에 정리!
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
 
        System.out.println(url);
    }
}

//output : %ED%95%9C%EA%B8%80+%EC%9D%B8%EC%BD%94%EB%94%A9+%EC%9D%B4%EB%9D%BC%EB%84%A4%7E
Decoder
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
 
public class URLDecodeTest {
    public static void main(String[] args) {
        String url = null;
 
        try {
            url = URLDecoder.decode("%ED%95%9C%EA%B8%80+%EC%9D%B8%EC%BD%94%EB%94%A9+%EC%9D%B4%EB%9D%BC%EB%84%A4%7E", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
 
        System.out.println(url);
    }
 
}
//output : 한글 인코딩
  • UploadController에서는 업로드 결과를 반환하기 위해서 ResponseEntity를 이용해서 이를 처리하는 형태로 변경합니다.
   @PostMapping("/uploadAjax")
    public ResponseEntity<List<UploadResultDTO>> uploadFile(MultipartFile[] uploadFiles) {
    			//추가된 부분

       List<UploadResultDTO> resultDTOList = new ArrayList<>();
        for (MultipartFile uploadFile : uploadFiles) {

            // 이미지 파일만 업로드 가능
            if(uploadFile.getContentType().startsWith("image") == false){
                // 이미지가 아닌경우 403 Forbidden 반환
                return new ResponseEntity<>(HttpStatus.FORBIDDEN);
            }

            // 실제 파일 이름 IE나 Edge는 전체 경로가 들어오므로
            String originalName = uploadFile.getOriginalFilename();

            String fileName = originalName.substring(originalName.lastIndexOf("\\") + 1);

            // 날짜 폴더 생성
            String folderPath = makeFolder();

            //UUID
            String uuid = UUID.randomUUID().toString();

            //저장할 파일 이름 
            String saveName = uploadPath + File.separator + folderPath + File.separator + uuid + fileName;

            Path savePath = Paths.get(saveName);

            try {
                uploadFile.transferTo(savePath);// 실제 이미지 저장
                resultDTOList.add(new UploadResultDTO(fileName,uuid,folderPath));
                //dto에 controller에서 생성된 fileName,uuid,folderPath를 넣어준다.
            }catch (IOException e){
                e.printStackTrace();
            }
        }

        return new ResponseEntity<>(resultDTOList, HttpStatus.OK);
    }
  • 메서드의 리턴 타입은 void 에서 ResponseEntity<List<UploadResultDTO>>로 변경하고, 이미지가 아닌 파일의 경우에는 예외 처리 대신 '403Forbidden'을 반환하도록 변경해줍니다.

  • 브라우저는 업로드 처리 후에 JSON의 배열 형태로 결과를 전달 받게 됩니다.

좋은 웹페이지 즐겨찾기