티스토리 뷰
스프링에서 파일업로드시 이미지의 화질, 크기들을 그대로 반영하여 업로드 한다 좀더 저장공간과 속도를 생각하면 변환하여 저장해야한다
스프링에서 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);//그려진 이
}
}
위 코드를 사용하면 업로드된 파일을 변환하여 저장
'Spring' 카테고리의 다른 글
[Spring] The prefix "p" for attribute "p:order" associated with an element type "bean" is not bound. (0) | 2019.08.25 |
---|---|
[Spring] json 메세지 컨버터 사용 (0) | 2019.08.25 |
StandardServletMultipartResolver 설정 (0) | 2019.04.29 |
SLF4J Log 설정 (0) | 2019.04.27 |
spring boot + react 과정 (Eclipse) (0) | 2019.04.19 |