티스토리 뷰

728x90
반응형

스프링에서 파일업로드시 이미지의 화질, 크기들을 그대로 반영하여 업로드 한다  좀더 저장공간과 속도를 생각하면 변환하여 저장해야한다


스프링에서 JAI를 사용하기위해서는 3가지가 필요하다

1. jai_core

2. jai_codec

3. jai_imageio


위 3개를 google에 maven jai 를 검색하여 dependency, repository를 pom.xml에 등록한다


public static void createImage(String loadFile, String saveFile,int zoom) throws IOException{

File  thum = new File(saveFile);//썸네일 이미지에 대한 파일 객체 생성

RenderedOp  render = JAI.create("fileload", loadFile); //원본 이미지에 대한 RenderedOp 객체 생성

BufferedImage bi = render.getAsBufferedImage();//BufferImage 객체를 얻어옴

if(zoom <= 0) zoom = 1;//축소비율이 0이 될수없으므로

int width = bi.getWidth()  / zoom;

int height = bi.getHeight() / zoom;


System.out.println("");

BufferedImage bufferIm = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics2D  g2 = bufferIm.createGraphics();//Graphics2D 객체 생성

g2.drawImage(bi, 0, 0, width, height, null);//이미지를 가로 ,세로 크기로 그린다.    

ImageIO.write(bufferIm, "jpeg", thum);//그려진 이미지를 파일로 채움

}


loadFile : 원본이미지

saveFile : 썸네일로 만들 이미지

zoom : 축소 비율   6이 적당


loadFile을 사용자가 보낸 멀티파트파일 그대로 사용하면 JAI.create 부분에서 에러가 발생한다 

standardServletMultipartResolver를 이용하여 사용자가 보낸 이미지를 저장한후 썸네일 이미지로 오버라이트 하는 방법을 이용한다


@Service

public class FileuploadService 

{

@Autowired

private EmployeeDao employeeDao;


private final String mappingUrl = "/uploads/images/";


public String restore( MultipartFile profilePicture)

{

String url = "/usr/local/quicksilver/xorwnTest/upload/";

int zoom = 6; //축소하고 싶은 비율


try

{

if( profilePicture.getSize() == 0 )

{

return url;

}


String saveFileName = generateSaveFileName();

profilePicture.transferTo(new File(saveFileName));

createImage( url + saveFileName, url + saveFileName, zoom);

return mappingUrl + saveFileName;

}

catch (IOException e) 

{

new RuntimeException("upload fail");

}

return url;

}


private String generateSaveFileName()

{

String fileName = "";

Calendar calendar = Calendar.getInstance();


fileName += calendar.get(Calendar.YEAR);

fileName += calendar.get(Calendar.MONTH);

fileName += calendar.get(Calendar.DATE);

fileName += calendar.get(Calendar.HOUR);

fileName += calendar.get(Calendar.MINUTE);

fileName += calendar.get(Calendar.SECOND);

fileName += calendar.get(Calendar.MILLISECOND);

fileName += (".jpeg");


return fileName;

}


public int updateProfilePicture(String path, String empSeq) {

EmployeesVo employeesVo = new EmployeesVo();

employeesVo.setPicFileID(path);

employeesVo.setEmpSeq(empSeq);


return employeeDao.update(employeesVo);

}


public static void createImage(String loadFile, String saveFile, int zoom) throws IOException{


File  thum = new File(saveFile);//썸네일 이미지에 대한 파일 객체 생성

System.out.println(loadFile);

RenderedOp render = JAI.create("fileload", loadFile); //원본 이미지에 대


BufferedImage bi = render.getAsBufferedImage();//BufferImage 객체를 얻어옴

if(zoom <= 0) zoom = 1;//축소비율이 0이 될수없으므로

int width = bi.getWidth()  / zoom;

int height = bi.getHeight() / zoom;

BufferedImage bufferIm = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics2D  g2 = bufferIm.createGraphics();//Graphics2D 객체 생성

g2.drawImage(bi, 0, 0, width, height, null);//이미지를 가로 ,세로 크기로

ImageIO.write(bufferIm, "jpeg", thum);//그려진 이

}

}

위 코드를 사용하면 업로드된 파일을 변환하여 저장

728x90
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함