이미지가 정상적으로 업로드 처리가 되었지만, 원본 이미지가 그대로 나오면 데이터를 많이 소비하기 때문에 가능하면 섬네일을 만들어서 만들어서 전송해주고 원본을 보려고 할 때 원본 파일을 보여주는 방식이 더 좋습니다.(특히 목록 페이지는 이미지가 많아지므로 주의해야 합니다.)
<img>
태그로 처리해줍니다.Thumbnailator 라이브러리 : https://github.com/coobird/thumbnailator
implementation group: 'net.coobird', name: 'thumbnailator', version: '0.4.14'
@RestController
@Log4j2
public class UploadController {
@Value("${part4.upload.path}") //application.properties의 변수
private String uploadPath;
@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);
log.info("fileName: "+fileName);
// 날짜 폴더 생성
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);
//섬네일 생성 (섬네일 파일 이름은 중간에 "s_"로 시작하도록)
String thumbnailSaveName = uploadPath + File.separator + folderPath + File.separator
+ "s_" + uuid + fileName;
File thumbnailFile = new File(thumbnailSaveName);
Thumbnailator.createThumbnail(savePath.toFile(), thumbnailFile,100,100);
resultDTOList.add(new UploadResultDTO(fileName,uuid,folderPath));
}catch (IOException e){
e.printStackTrace();
</--------------------------------------------/>
}
}
public String getImageURL(){ //추후에 전체 경로가 필요한 경우를 대비하여 생성
try{
return URLEncoder.encode(folderPath+"/"+uuid+"_"+fileName,"UTF-8");
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return "";
}
public String getThumbnailURL(){
try{
return URLEncoder.encode(folderPath+"/s_"+uuid+"_"+fileName,"UTF-8");
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return "";
}
1.JS에서 getter는 자바에서 알던것과 다소 달랐습니다.
2. 메서드 앞에 get 키워드를 사용하여 정의합니다.(왜get으로 시작했는가)
3. 메서드 이름을 클래스의 프로퍼티처럼 사용할 수 있습니다.
4. 파라미터가 없어야 하며 무언가를 반환해야 합니다.(String타입,리턴을 ""이유)
// 추가
// Ajax 업로드 이후 이미지들을 호출하는 함수
function showUploadedImage(arr){
console.log(arr);
var divArea = $(".uploadResult");
for(var i =0; i<arr.length; i++){
divArea.append("<img src='/display?fileName=" + arr[i].thumbnailURL+"'>");
//imageURL을 thumbnailURL로 변경
}
}