[SPRING]업로드 결과 반환과 화면처리-(2)
정상적인 사이즈의 이미지 파일이라면 업로드가 처리되지만 아직 브루우저에는 아무런 결과가 반영되지 않았습니다.
결과 데이터는 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의 배열 형태로 결과를 전달 받게 됩니다.
Author And Source
이 문제에 관하여([SPRING]업로드 결과 반환과 화면처리-(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jyyoun1022/SPRING업로드-결과-반환과-화면처리-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)