2014.02.22 01:17
package hwk; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class HBoxUpload { String baseHost = "hbox.a3c.co.kr"; public InputStream getDownloadStream(String bucket, String objectKey, String accessKey, String secretKey)throws Exception{ String url = getDownloadUrl(bucket, objectKey, accessKey, secretKey, 30); URL downloadUrl = new URL(url); URLConnection conn = downloadUrl.openConnection(); return conn.getInputStream(); } public String getDownloadUrl(String bucket, String objectKey, String accessKey, String secretKey, int expiresInSeconds)throws Exception{ String method = "GET"; String path = "/"+ bucket +"/"+objectKey ; Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); long secondsSinceEpoch = calendar.getTimeInMillis() / 1000L + expiresInSeconds; String expires =Long.toString(secondsSinceEpoch); String canonicalString = getCanonicalString(method, path, null, null, expires, null, null); Mac mac = setKey(secretKey); String signature = URLEncoder.encode(sign(mac, canonicalString), "UTF8"); StringBuffer url = new StringBuffer(); url.append("http://").append(bucket).append(".").append(baseHost).append("/").append(objectKey); url.append("?Signature=").append(signature).append("&Expires=").append(expires).append("&AWSAccessKeyId=").append(accessKey); return url.toString(); } public void uploadStream(String bucket, String objectKey, InputStream stream, long streamLength, String contentType, String method, String contentMd5, List amzHeaders, String accessKey, String secretKey)throws Exception{ String expires = null; String hostName = bucket+"."+baseHost; Mac mac = setKey(secretKey); String url = "/"+objectKey ; String fmt = "EEE, dd MMM yyyy HH:mm:ss "; SimpleDateFormat df = new SimpleDateFormat(fmt, Locale.US); df.setTimeZone(TimeZone.getTimeZone("GMT")); // Data needed for signature String date = df.format(new Date()) + "GMT"; String path = "/"+ bucket +"/"+objectKey ; String canonicalString = getCanonicalString(method, path, contentMd5, contentType, expires, date, amzHeaders); String signature = sign(mac, canonicalString); Socket socket = new Socket(hostName, 80); OutputStream os = socket.getOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(baos); osw.write(method);osw.write(" ");osw.write(url);osw.write(" HTTP/1.1\n"); osw.write("Host :");osw.write(hostName);osw.write("\n"); if (contentType != null){ osw.write("Content-Type :");osw.write(contentType);osw.write("\n"); } if (contentMd5 != null){ osw.write("Content-MD5 :");osw.write(contentMd5);osw.write("\n"); } osw.write("Date :");osw.write(date);osw.write("\n"); osw.write("Authorization : AWS ");osw.write(accessKey);osw.write(":");osw.write(signature);osw.write("\n"); osw.write("Content-Length :");osw.write(Long.toString(streamLength));osw.write("\n"); osw.write("\n"); osw.close(); os.write(baos.toByteArray()); int buflength = 1024; byte[] buffer = new byte[buflength]; int nbytethistime = 0; long nbyteleft = streamLength; while(nbyteleft > 0){ nbytethistime = stream.read(buffer); if (nbytethistime < 1) { break; } nbyteleft -= nbytethistime; os.write(buffer, 0, nbytethistime); } baos = new ByteArrayOutputStream(); InputStream is = socket.getInputStream(); while((nbytethistime = is.read(buffer)) > 0){ baos.write(buffer,0,nbytethistime); } baos.close(); is.close(); os.close(); String response = baos.toString("UTF8"); if (response.indexOf("200 OK") < 1){ System.out.println(response); throw new Exception("upload error"); } } private Mac setKey(String AWSSecretKey)throws Exception { Mac mac = Mac.getInstance("HmacSHA1"); byte[] keyBytes = AWSSecretKey.getBytes("UTF8"); SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); mac.init(signingKey); return mac; } private String getCanonicalString(String method, String path, String content_md5 , String content_type, String expires, String date, List amz_headers){ StringBuffer canonicalString = new StringBuffer(); canonicalString.append( method ).append("\n"); if (content_md5 != null){ canonicalString.append( content_md5 ); } canonicalString.append( "\n" ); if (content_type != null){ canonicalString.append( content_type ); } canonicalString.append( "\n" ); if (expires != null){ canonicalString.append( expires ); }else if( date != null){ canonicalString.append( date ); } canonicalString.append( "\n" ); if (amz_headers != null){ for( String[] kv : amz_headers){ canonicalString.append(kv[0]).append(":").append(kv[1]).append("\n"); } } canonicalString.append( path); return canonicalString.toString(); } private String sign(Mac mac, String canonicalString)throws Exception { // Signed String must be BASE64 encoded. byte[] signBytes = mac.doFinal(canonicalString.getBytes("UTF8")); String signature = Base64.encodeBase64String(signBytes); return signature; } }
package hwk; import static org.junit.Assert.*; import hwk.HBoxUpload; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.util.List; import org.junit.Test; public class test_HBoxUpload { @Test public void getDownloadUrl()throws Exception{ String bucket = "bucket4"; String objectKey = "flazr.tar.gz"; String accessKey = "JJ0Y0DEV7YY9U3QBDY0Y"; String secretKey = "B4tuiB6H7/hCG4eiwXvUNxoZY6+vk+FxFTTpNF2l"; InputStream is = new HBoxUpload().getDownloadStream(bucket, objectKey, accessKey, secretKey); byte[] buf = new byte[1024]; int nbytethistime = 0; FileOutputStream fos = new FileOutputStream("/home/hsnam/flazr.tar.gz"); while((nbytethistime = is.read(buf))> 0){ fos.write(buf,0, nbytethistime); } fos.close(); is.close(); } @Test public void uploadStream()throws Exception { File source = new File("c:\\test\\flazr.tar.gz"); String bucket = "bucket4"; String objectKey = "flazr.tar.gz"; InputStream stream = new FileInputStream(source); long streamLength = source.length(); String contentType = "image/jpg"; String method = "PUT"; String contentMd5 = null; List amzHeaders = null; String accessKey = "JJ0Y0DEV7YY9U3QBDY0Y"; String secretKey = "B4tuiB6H7/hCG4eiwXvUNxoZY6+vk+FxFTTpNF2l"; new HBoxUpload().uploadStream(bucket, objectKey, stream, streamLength, contentType, method, contentMd5, amzHeaders, accessKey, secretKey); } }
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
8 |
HBox를 이용한 블로그 이미지 호스팅
![]() | 호스트웨이 | 2014.03.19 | 14426 |
7 | HBox Linux Filesystem | 호스트웨이 | 2014.02.22 | 9518 |
» |
HBox Java Upload codes
![]() | 호스트웨이 | 2014.02.22 | 8781 |
5 |
HBox Wordpress Plugin Setup
![]() | 호스트웨이 | 2014.02.22 | 18190 |
4 |
HBox Desktop apps
![]() | 호스트웨이 | 2014.02.22 | 12679 |
3 | HBox API Spec | 호스트웨이 | 2014.02.21 | 8564 |
2 |
HBox 웹 콘솔 메뉴얼
![]() | 호스트웨이 | 2014.02.21 | 9591 |
1 | HBox 베타 서비스 안내 | 호스트웨이 | 2014.02.21 | 9625 |