S3-客户端API测试

S3-客户端API测试

    博客分类: 
  • 云存储
 

根据S3的Amazon S3 API Reference 和Amazon S3 Developer Guide,使用JAVA编写的putObject和getObject测试,同时测试了:MD5特性,ETAG,RANGE。

 

Java代码   收藏代码
  1. package amazons3;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.Closeable;  
  6. import java.io.File;  
  7. import java.io.FileInputStream;  
  8. import java.io.FileOutputStream;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.URL;  
  11. import java.security.MessageDigest;  
  12. import java.util.Date;  
  13. import java.util.Map;  
  14.   
  15. import javax.crypto.Mac;  
  16. import javax.crypto.spec.SecretKeySpec;  
  17.   
  18. import org.apache.commons.codec.binary.Base64;  
  19. import org.apache.commons.httpclient.util.DateUtil;  
  20. import org.apache.commons.lang.StringUtils;  
  21. import org.apache.log4j.Logger;  
  22.   
  23. import sun.misc.BASE64Encoder;  
  24.   
  25. public class S3ClientSimpleTest {  
  26.   
  27.     private static final Logger logger = Logger.getLogger(S3ClientSimpleTest.class);  
  28.   
  29.     static String accessKey = "your accessKey";  
  30.     static String secretKey = "your secretKey";  
  31.     static String bucket = "your bucket";  
  32.   
  33.     public static void main(String[] args) throws Exception {  
  34.         File localFile = new File("D:/temp/s3testfile.txt");  
  35.         putObject(localFile);  
  36.         getObject("s3testfile.txt""d:/temp/download"nullnullnull);  
  37.     }  
  38.   
  39.     public static void putObject(File localFile) throws Exception {  
  40.         HttpURLConnection conn = null;  
  41.         BufferedInputStream in = null;  
  42.         BufferedOutputStream out = null;  
  43.         try {  
  44.             URL url = new URL("http://" + bucket + ".s3.amazonaws.com/" + localFile.getName());  
  45.             conn = (HttpURLConnection) url.openConnection();  
  46.             conn.setRequestMethod("PUT");  
  47.             conn.setDoOutput(true);  
  48.             conn.setDoInput(true);  
  49.   
  50.             String contentMD5 = md5file(localFile);  
  51.             logger.info("ContentMD5: " + contentMD5);  
  52.             String contentType = "application/xml";  
  53.             Date date = new Date();  
  54.             String dateString = DateUtil.formatDate(date, DateUtil.PATTERN_RFC1036);  
  55.             String sign = sign("PUT", contentMD5, contentType, dateString, "/" + bucket + "/" + localFile.getName(), null);  
  56.             conn.setRequestProperty("Date", dateString);  
  57.             conn.setRequestProperty("Authorization", sign);  
  58.             conn.setRequestProperty("Content-Type", contentType);  
  59.             conn.setRequestProperty("Content-MD5", contentMD5);  
  60.   
  61.             out = new BufferedOutputStream(conn.getOutputStream());  
  62.             in = new BufferedInputStream(new FileInputStream(localFile));  
  63.   
  64.             byte[] buffer = new byte[1024];  
  65.             int p = 0;  
  66.             while ((p = in.read(buffer)) != -1) {  
  67.                 out.write(buffer, 0, p);  
  68.                 out.flush();  
  69.             }  
  70.   
  71.             int status = conn.getResponseCode();  
  72.             logger.info("http status: " + status);  
  73.             logger.info("after:\n" + conn.getHeaderFields());  
  74.   
  75.         } catch (Exception e) {  
  76.             e.printStackTrace();  
  77.             throw new RuntimeException(e);  
  78.         } finally {  
  79.             close(in);  
  80.             close(out);  
  81.         }  
  82.     }  
  83.   
  84.     public static File getObject(String objectName, String rootPath, Long start, Long end, String etag) {  
  85.   
  86.         HttpURLConnection conn = null;  
  87.         BufferedInputStream in = null;  
  88.         BufferedOutputStream out = null;  
  89.         try {  
  90.             URL url = new URL("http://" + bucket + ".s3.amazonaws.com/" + objectName);  
  91.             conn = (HttpURLConnection) url.openConnection();  
  92.             conn.setRequestMethod("GET");  
  93.             conn.setDoOutput(true);  
  94.   
  95.             String contentType = "application/xml";  
  96.             Date date = new Date();  
  97.             String dateString = DateUtil.formatDate(date, DateUtil.PATTERN_RFC1036);  
  98.             String sign = sign("GET""", contentType, dateString, "/" + bucket + "/" + objectName, null);  
  99.             conn.setRequestProperty("Date", dateString);  
  100.             conn.setRequestProperty("Authorization", sign);  
  101.             conn.setRequestProperty("Content-Type", contentType);  
  102.   
  103.             // Range 特性  
  104.             if (start != null && end != null) {  
  105.                 conn.setRequestProperty("Range""bytes=" + start + "-" + end);  
  106.             }  
  107.   
  108.             // Etag 特性  
  109.             if (StringUtils.isNotBlank(etag)) {  
  110.                 conn.setRequestProperty("If-None-Match", etag);  
  111.             }  
  112.   
  113.             int status = conn.getResponseCode();  
  114.             logger.info("http status: " + status);  
  115.             if (status == 304) {  
  116.                 // ETAG未变化,文件未变化,服务器返回空body  
  117.                 logger.info("after:\n" + conn.getHeaderFields());  
  118.                 return null;  
  119.             }  
  120.   
  121.             in = new BufferedInputStream(conn.getInputStream());  
  122.             File localFile = new File(rootPath + "/" + objectName);  
  123.             if (!localFile.getParentFile().exists()) {  
  124.                 localFile.getParentFile().mkdirs();  
  125.             }  
  126.             out = new BufferedOutputStream(new FileOutputStream(localFile, false));  
  127.   
  128.             byte[] buffer = new byte[1024];  
  129.             int p = 0;  
  130.             while ((p = in.read(buffer)) != -1) {  
  131.                 out.write(buffer, 0, p);  
  132.                 out.flush();  
  133.             }  
  134.             logger.info("after:\n" + conn.getHeaderFields());  
  135.             return localFile;  
  136.         } catch (Exception e) {  
  137.             e.printStackTrace();  
  138.             throw new RuntimeException(e);  
  139.         } finally {  
  140.             close(in);  
  141.             close(out);  
  142.         }  
  143.   
  144.     }  
  145.   
  146.     private static void close(Closeable c) {  
  147.         try {  
  148.             if (c != null) {  
  149.                 c.close();  
  150.             }  
  151.         } catch (Exception e) {  
  152.             throw new RuntimeException(e);  
  153.         }  
  154.     }  
  155.   
  156.     /** 
  157.      * MD5文件 
  158.      *  
  159.      * @param file 
  160.      * @return 
  161.      * @throws Exception 
  162.      */  
  163.     public static String md5file(File file) throws Exception {  
  164.         MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
  165.         BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));  
  166.         byte[] buf = new byte[1024 * 100];  
  167.         int p = 0;  
  168.         while ((p = in.read(buf)) != -1) {  
  169.             messageDigest.update(buf, 0, p);  
  170.         }  
  171.         in.close();  
  172.         byte[] digest = messageDigest.digest();  
  173.   
  174.         BASE64Encoder encoder = new BASE64Encoder();  
  175.         return encoder.encode(digest);  
  176.     }  
  177.   
  178.     /** 
  179.      * 计算签名 
  180.      *  
  181.      * @param httpVerb 
  182.      * @param contentMD5 
  183.      * @param contentType 
  184.      * @param date 
  185.      * @param resource 
  186.      * @param metas 
  187.      * @return 
  188.      */  
  189.     public static String sign(String httpVerb, String contentMD5, String contentType, String date, String resource, Map<String, String> metas) {  
  190.   
  191.         String stringToSign = httpVerb + "\n" + StringUtils.trimToEmpty(contentMD5) + "\n" + StringUtils.trimToEmpty(contentType) + "\n" + date + "\n";  
  192.         if (metas != null) {  
  193.             for (Map.Entry<String, String> entity : metas.entrySet()) {  
  194.                 stringToSign += StringUtils.trimToEmpty(entity.getKey()) + ":" + StringUtils.trimToEmpty(entity.getValue()) + "\n";  
  195.             }  
  196.         }  
  197.         stringToSign += resource;  
  198.         try {  
  199.             Mac mac = Mac.getInstance("HmacSHA1");  
  200.             byte[] keyBytes = secretKey.getBytes("UTF8");  
  201.             SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");  
  202.             mac.init(signingKey);  
  203.             byte[] signBytes = mac.doFinal(stringToSign.getBytes("UTF8"));  
  204.             String signature = encodeBase64(signBytes);  
  205.             return "AWS" + " " + accessKey + ":" + signature;  
  206.         } catch (Exception e) {  
  207.             throw new RuntimeException("MAC CALC FAILED.");  
  208.         }  
  209.   
  210.     }  
  211.   
  212.     private static String encodeBase64(byte[] data) {  
  213.         String base64 = new String(Base64.encodeBase64(data));  
  214.         if (base64.endsWith("\r\n"))  
  215.             base64 = base64.substring(0, base64.length() - 2);  
  216.         if (base64.endsWith("\n"))  
  217.             base64 = base64.substring(0, base64.length() - 1);  
  218.   
  219.         return base64;  
  220.     }  
  221.   
  222. }  

你可能感兴趣的:(Web,S3,Amazon,Services)