정상적인 사이즈의 이미지 파일이라면 업로드가 처리되지만 아직 브루우저에는 아무런 결과가 반영되지 않았습니다.
결과 데이터는 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
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
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 : 한글 인코딩
@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의 배열 형태로 결과를 전달 받게 됩니다.