Java

원격지의 이미지 파일을 읽어서 원하는 곳에 업로드 하기

체리필터 2017. 2. 9. 10:33
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
반응형