728x90
반응형
보통 개발 시에 파일 업로드를 하려 하면 html form에서 multipart/form-data로 파일을 선택해서 업로드 하고, 이를 서버 단에서 받아 처리를 하게 된다.
하지만 이런 방법이 아니라 원격지의 이미지 파일을 읽어온 후 필요 시 리사이지, 그리고 나서 다시 다른 곳에 있는 서버로 파일을 업로드 하는 기능이 필요해 개발을 하다 보니, 많이 사용되는 방법이 아니기에 정리해 둔다.
<원격지에서 파일을 읽어 들여 파일 객체로 만든 후 리사이징, 업로드하기>
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import javax.imageio.ImageIO;
private String uploadCdn(URL imageURL, int maxWidth, long maxSize) throws IOException, UploadSizeLimitExceededException, CDNUploadException {
// 리사이징...
BufferedImage originalMainImage = ImageIO.read(imageURL);
String fileType = Files.probeContentType(new File(imageURL.getFile()).toPath()); // mime type
String fileExtension = "";
if(StringUtils.equals("image/jpeg", fileType)) {
fileExtension = "jpg";
} else if(StringUtils.equals("image/png", fileType)) {
fileExtension = "png";
} else if(StringUtils.equals("image/gif", fileType)) {
fileExtension = "gif";
} else {
// throw Exception
}
// Upload FileName generate
int imageWidth = originalMainImage.getWidth();
int imageHeight = originalMainImage.getHeight();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] imageInByte;
if(originalMainImage.getWidth() > maxWidth) {
int type = originalMainImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalMainImage.getType();
int resizeHeight = (maxWidth * imageHeight) / imageWidth;
BufferedImage resizedMainImage = CommonUtil.resizeImage(originalMainImage, type,
maxWidth, resizeHeight);
ImageIO.write( resizedMainImage, fileExtension, baos );
} else {
ImageIO.write( originalMainImage, fileExtension, baos );
}
baos.flush();
imageInByte = baos.toByteArray();
baos.close();
// 이미지 사이즈 체크
long size = imageInByte.length;
if(size > maxSize) {
// throw Exception
}
// upload 후 업로드 된 이미지의 URL 리턴...
return uploadedFullUrl;
}
<이미지 리사이징>
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
public static BufferedImage resizeImage(BufferedImage originalImage, int type, int width, int height){
BufferedImage resizedImage = new BufferedImage(width, height, type);
Graphics2D g = resizedImage.createGraphics();
// 품질 관련 코드... 기본 품질은 글자가 다 깨짐...
RenderingHints rh = new RenderingHints(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHints(rh);
g.drawImage(originalImage, 0, 0, width, height, null);
g.dispose();
return resizedImage;
}
728x90
반응형
'Java' 카테고리의 다른 글
추상클래스와 인터페이스의 차이 (0) | 2021.02.08 |
---|---|
Java 기본 내용을 위한 북마크 (0) | 2021.01.28 |
RequestBody를 Enum 값에 Setting 할 때 생기는 문제 (0) | 2019.11.13 |
Java8의 for, stream foreach, parallelStream foreach 간단 속도 테스트 (0) | 2017.02.14 |
MySQL의 zero date("0000-00-00 00:00:00") 값이 Date 값으로 넘어오지 않는 경우 (0) | 2015.04.06 |