`

S3特性测试

 
阅读更多

 

package amazons3;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.FileEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.cookie.DateUtils;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

/**
 * S3 client with apache httpclient 4.x
 * 
 * @author zhangpu
 * 
 */
public class S3HttpClient {

	private static final Logger logger = Logger.getLogger(S3HttpClient.class);

	static String accessKey = "AKIAJC2MNN5XZWLRB4UQ";
	static String secretKey = "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";
	static String bucket = "zhangpu";

	public static void main(String[] args) throws Exception {
		File localFile = new File("D:/temp/s3testfile.txt");
		String objectName = localFile.getName() + "1";
		// postObject(bucket, objectName, localFile, null, false, null, null);
		Map<String, String> protocols = new TreeMap<String, String>();
		Map<String, String> metas = new TreeMap<String, String>();
		metas.put("x-amz-meta-name", "zhangpu");
		metas.put("x-amz-meta-type", "type");
		putObject(bucket, objectName, localFile, "text/plant", false, null, metas);
		getObject(bucket, objectName, null, null, null, null);
		protocols.clear();
		protocols.put(HttpHeaders.IF_NONE_MATCH, "3e89d34c93742d0a92d4dce69a857e2f");
		protocols.put(HttpHeaders.CONTENT_ENCODING, "gzip");
		getObject(bucket, objectName, null, protocols, null, null);
		headObject(bucket, objectName, null, null);
		deleteObject(bucket, objectName, null);
	}

	/**
	 * POST方式上传文件
	 * 
	 * @param bucket
	 * @param objectName
	 * @param localFile
	 * @param contentType
	 * @param checkDigest
	 * @param protocols
	 * @param metas
	 * @return
	 * @throws Exception
	 */
	public static Header[] postObject(String bucket, String objectName, File localFile, String contentType, boolean checkDigest, Map<String, String> protocols,
			Map<String, String> metas) throws Exception {

		HttpClient httpClient = new DefaultHttpClient();
		if (StringUtils.isBlank(objectName)) {
			objectName = localFile.getName();
		}
		String url = "http://" + bucket + ".s3.amazonaws.com/" + objectName;
		String resource = "/" + bucket + "/" + objectName;
		HttpPost request = new HttpPost(url);

		Charset charset = Charset.forName("UTF-8");
		MultipartEntity mpEntity = new MultipartEntity();
		mpEntity.addPart("key", new StringBody("/user/${filename}", charset));
		if (StringUtils.isNotBlank(contentType)) {
			mpEntity.addPart("Content-Type", new StringBody(contentType, charset));
		}

		if (metas != null && metas.size() > 0) {
			for (Map.Entry<String, String> entry : metas.entrySet()) {
				mpEntity.addPart(entry.getKey(), new StringBody(entry.getValue(), charset));
			}
		}
		mpEntity.addPart("AWSAccessKeyId", new StringBody(accessKey, charset));
		String Signature = SignUtils.hmac(accessKey, secretKey, "POST", "", contentType, "", resource, protocols, metas);
		mpEntity.addPart("Signature", new StringBody(Signature, charset));

		ContentBody fileBody = new FileBody(localFile);
		mpEntity.addPart("file", fileBody);

		request.setEntity(mpEntity);
		printRequest(request);

		HttpResponse response = httpClient.execute(request);
		printResponse(response);
		HttpEntity entity = response.getEntity();
		if (entity != null && entity.getContentLength() > 0) {
			logger.info("entity:\n" + EntityUtils.toString(response.getEntity()));
		}
		logger.info("");
		logger.info("");

		return null;
	}

	/**
	 * 上传文件
	 * 
	 * @param bucket
	 * @param objectName
	 * @param localFile
	 * @param contentType
	 * @param md5
	 * @param protocols
	 * @param metas
	 */
	public static void putObject(String bucket, String objectName, File localFile, String contentType, boolean checkDigest, Map<String, String> protocols,
			Map<String, String> metas) throws Exception {

		HttpClient httpClient = new DefaultHttpClient();
		if (StringUtils.isBlank(objectName)) {
			objectName = localFile.getName();
		}
		String url = "http://" + bucket + ".s3.amazonaws.com/" + objectName;
		String resource = "/" + bucket + "/" + objectName;
		HttpPut request = new HttpPut(url);
		String contentMD5 = "";
		if (checkDigest) {
			contentMD5 = SignUtils.md5file(localFile);
		}
		Date date = new Date();
		String dateString = DateUtils.formatDate(date, DateUtils.PATTERN_RFC1036);
		String authorization = SignUtils.sign(accessKey, secretKey, "PUT", contentMD5, contentType, dateString, resource, protocols, metas);
		request.addHeader("Date", dateString);
		request.addHeader("Authorization", authorization);
		if (StringUtils.isNotBlank(contentMD5)) {
			request.addHeader("Content-MD5", contentMD5);
		}
		if (StringUtils.isNotBlank(contentType)) {
			request.addHeader("Content-Type", contentType);
		}
		marshallProtocol(request, protocols);
		marshallProtocol(request, metas);
		printRequest(request);
		FileEntity fileEntity = new FileEntity(localFile, contentType);
		request.setEntity(fileEntity);
		HttpResponse response = httpClient.execute(request);
		printResponse(response);
		HttpEntity entity = response.getEntity();
		if (entity != null && entity.getContentLength() > 0) {
			logger.info("entity:\n" + EntityUtils.toString(response.getEntity()));
		}
		logger.info("");
		logger.info("");
	}

	/**
	 * 下载文件
	 * 
	 * @param bucket
	 * @param objectName
	 * @param versionId
	 * @param protocols
	 * @param metas
	 * @throws IOException
	 */
	public static void getObject(String bucket, String objectName, String versionId, Map<String, String> protocols, Map<String, String> metas,
			Map<String, String> queries) throws IOException {
		HttpClient httpClient = new DefaultHttpClient();

		String query = marshallQuery(queries);
		String url = "http://" + bucket + ".s3.amazonaws.com/" + objectName + query;
		HttpGet request = new HttpGet(url);
		Date date = new Date();
		String dateString = DateUtils.formatDate(date, DateUtils.PATTERN_RFC1036);
		String resource = "/" + bucket + "/" + objectName + query;
		String authorization = SignUtils.sign(accessKey, secretKey, "GET", "", "", dateString, resource, protocols, metas);
		request.addHeader("Date", dateString);
		request.addHeader("Authorization", authorization);
		marshallProtocol(request, protocols);
		marshallProtocol(request, metas);

		printRequest(request);
		HttpResponse response = httpClient.execute(request);
		printResponse(response);
		HttpEntity entity = response.getEntity();
		if (entity != null && entity.getContentLength() > 0) {
			logger.info("entity:\n" + EntityUtils.toString(response.getEntity()));
		}
		logger.info("");
	}

	public static void headObject(String bucket, String objectName, String versionId, Map<String, String> protocols) throws IOException {

		HttpClient httpClient = new DefaultHttpClient();
		String url = "http://" + bucket + ".s3.amazonaws.com/" + objectName;

		HttpHead request = new HttpHead(url);
		Date date = new Date();
		String dateString = DateUtils.formatDate(date, DateUtils.PATTERN_RFC1036);
		String authorization = SignUtils.sign(accessKey, secretKey, "HEAD", "", "", dateString, "/" + bucket + "/" + objectName, null, null);
		request.addHeader("Date", dateString);
		request.addHeader("Authorization", authorization);
		marshallProtocol(request, protocols);

		printRequest(request);
		HttpResponse response = httpClient.execute(request);
		printResponse(response);

		HttpEntity entity = response.getEntity();
		if (entity != null && entity.getContentLength() > 0) {
			logger.info("entity:" + EntityUtils.toString(response.getEntity()));
		}
	}

	/**
	 * 删除对象
	 * 
	 * @param bucket
	 * @param objectName
	 * @param versionId
	 * @throws Exception
	 */
	public static void deleteObject(String bucket, String objectName, String versionId) throws Exception {
		HttpClient httpClient = new DefaultHttpClient();
		String url = "http://" + bucket + ".s3.amazonaws.com/" + URLEncoder.encode(objectName, "UTF-8");
		String resource = "/" + bucket + "/" + objectName;
		if (StringUtils.isNotBlank(versionId)) {
			url += "?versionId=" + versionId;
			resource += "?versionId=" + versionId;
		}
		HttpDelete request = new HttpDelete(url);
		Date date = new Date();
		String dateString = DateUtils.formatDate(date, DateUtils.PATTERN_RFC1036);
		String authorization = SignUtils.sign(accessKey, secretKey, "DELETE", "", "", dateString, resource, null, null);
		request.addHeader("Date", dateString);
		request.addHeader("Authorization", authorization);

		printRequest(request);
		HttpResponse response = httpClient.execute(request);
		printResponse(response);

		HttpEntity entity = response.getEntity();
		if (entity != null && entity.getContentLength() > 0) {
			logger.info("entity:" + EntityUtils.toString(response.getEntity()));
		}
	}

	/**
	 * 打印请求头
	 * 
	 * @param request
	 */
	private static void printRequest(HttpRequest request) {
		logger.info(request.getRequestLine());
		printHeader(request.getAllHeaders());
		logger.info("");
	}

	/**
	 * 打印响应头
	 * 
	 * @param response
	 */
	private static void printResponse(HttpResponse response) {
		logger.info(response.getStatusLine());
		printHeader(response.getAllHeaders());
	}

	/**
	 * 答应HTTP头
	 * 
	 * @param headers
	 */
	private static void printHeader(Header[] headers) {
		for (Header header : headers) {
			logger.info(header);
		}
	}

	/**
	 * 装配query
	 * 
	 * @param queries
	 * @return
	 */
	private static String marshallQuery(Map<String, String> queries) {
		String query = "";
		if (queries != null) {
			boolean first = true;
			for (Map.Entry<String, String> entry : queries.entrySet()) {
				query += (first ? "?" : "&") + entry.getKey() + "=" + entry.getValue();
				first = false;
			}
		}
		return query;
	}

	/**
	 * 设置请求协议
	 * 
	 * @param request
	 * @param protocols
	 */
	private static void marshallProtocol(HttpRequest request, Map<String, String> protocols) {
		if (protocols != null) {
			for (Map.Entry<String, String> entry : protocols.entrySet()) {
				request.addHeader(entry.getKey(), entry.getValue());
			}
		}
	}

}

 

 

package amazons3;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

import sun.misc.BASE64Encoder;

public final class SignUtils {

	/**
	 * MD5文件
	 * 
	 * @param file
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws IOException
	 */
	public static String md5file(File file) throws NoSuchAlgorithmException, IOException {
		MessageDigest messageDigest = MessageDigest.getInstance("MD5");
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
		byte[] buf = new byte[1024 * 100];
		int p = 0;
		while ((p = in.read(buf)) != -1) {
			messageDigest.update(buf, 0, p);
		}
		in.close();
		byte[] digest = messageDigest.digest();

		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(digest);
	}

	public static String simpleMd5File(File file) throws IOException {
		return DigestUtils.md5Hex(FileUtils.readFileToByteArray(file));
	}

	/**
	 * 计算签名
	 * 
	 * @param httpVerb
	 * @param contentMD5
	 * @param contentType
	 * @param date
	 * @param resource
	 * @param metas
	 * @return
	 */
	public static String sign(String accessKey, String secretKey, String httpVerb, String contentMD5, String contentType, String date, String resource,
			Map<String, String> protocols, Map<String, String> metas) {
		return "AWS" + " " + accessKey + ":" + hmac(accessKey, secretKey, httpVerb, contentMD5, contentType, date, resource, protocols, metas);
	}

	public static String hmac(String accessKey, String secretKey, String httpVerb, String contentMD5, String contentType, String date, String resource,
			Map<String, String> protocols, Map<String, String> metas) {

		String stringToSign = httpVerb + "\n" + StringUtils.trimToEmpty(contentMD5) + "\n" + StringUtils.trimToEmpty(contentType) + "\n" + StringUtils.trimToEmpty(date) + "\n";
		if (metas != null) {
			for (Map.Entry<String, String> entity : metas.entrySet()) {
				stringToSign += StringUtils.trimToEmpty(entity.getKey()) + ":" + StringUtils.trimToEmpty(entity.getValue()) + "\n";
			}
		}
		if (protocols != null) {
			for (Map.Entry<String, String> entity : protocols.entrySet()) {
				if (entity.getKey().startsWith("x-amz-")) {
					stringToSign += StringUtils.trimToEmpty(entity.getKey()) + ":" + StringUtils.trimToEmpty(entity.getValue()) + "\n";
				}
			}
		}
		stringToSign += resource;
		try {
			Mac mac = Mac.getInstance("HmacSHA1");
			byte[] keyBytes = secretKey.getBytes("UTF8");
			SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
			mac.init(signingKey);
			byte[] signBytes = mac.doFinal(stringToSign.getBytes("UTF8"));
			String signature = encodeBase64(signBytes);
			return signature;
		} catch (Exception e) {
			throw new RuntimeException("MAC CALC FAILED.");
		}

	}

	public static String encodeBase64(byte[] data) {
		String base64 = new String(Base64.encodeBase64(data));
		if (base64.endsWith("\r\n"))
			base64 = base64.substring(0, base64.length() - 2);
		if (base64.endsWith("\n"))
			base64 = base64.substring(0, base64.length() - 1);

		return base64;
	}
}
 
分享到:
评论

相关推荐

    人体通信信道测试系统的研究与实现.pdf

    设计了一种人体通信信道测试系统,具有“浮地”特性,能真实反映人体通信的耦 合或感应机制。该系统采用ARM7TDMI内核的S3C44BOX系统作为开发平台,使用直接数字合成器 (DDS)芯片AD9910设计可调频率信号源,使用...

    光电耦合器测试电路图大全

    光电耦合器运用广泛,依据光电耦合器特性,设计一个方便的测试光电耦合器电路,该电路简单、准确,使用方便。 电路原理: 当电源接通后,LED不发光。按下S2,LED会发光。调RP,LED的发光强度会发生变化,说明光电...

    S3C2410BSD

    BSDL(boundary scan description language)语言硬件描述语言(VHDL )的一个子集,是对边界扫描器件的边界扫描特性的描述,主要用来沟通边界扫描器件厂商、用户与测试工具之间的联系,其应用包括:厂商将BSDL 描述...

    H3C安全新产品开局测试一纸通 .rar

    2.3.2. ACG 8800-S3开局指导及典型配置 17 2.3.3. SecBlade ACG 开局指导及典型配置 17 2.3.4. ACG Manager开局指导及典型配置 17 2.3.5. 常见故障处理文档 17 2.4. 其它需要特别注意的问题 18 3. AFC流量清洗 19 ...

    老男孩第三期Python全栈开发视频教程 零基础系统学习Python开发视频+资料

    ├─(88) 08 python s3 day52 ORM的querySet集合对象的特性.avi ├─(89) day52课上所有.rar (17)\\python全栈day51-60\\python全栈s3 day53;目录中文件数:7个 ├─(90) 01 python s3 day53 admin介绍.avi ├─(91)...

    S 3对称性与夸克混合矩阵

    我们在夸克场上施加S3对称性,在此夸克域下,三个夸克中的两个像一个doublet一样转换,其余一个像一个doublet一样转换,... 我们还预测了具有非常规衰减特性的奇异新标量的存在,这些标量可以用于实验测试我们的模型。

    KCl对GeS2-Ga2S3硫系玻璃光学性能的影响

    采用熔融淬冷法制备了GeS2-Ga2S3-KCl系统玻璃,然后测试了样品的厚度、密度、吸收光谱和透射光谱,利用经典的Tauc方程计算了样品光学带隙允许的直接跃迁。结果显示,GeS2-Ga2S3-KCl玻璃拥有较好的物理性能;样品的密度、...

    郭天祥ARM9视频教程(第13和20讲均可观看).docx

    1. S3C2440存储控制器特性 2. SDRAM原理分析 3. NandFlash原理分析 第十一讲 ADS工具的使用,建立硬件调试环境 1. 建立ADS工程 2. 系统代码和NandFlash代码分析 3. 使用HJtag和Jlink调试硬件 4. GPIO原理分析,编写...

    u-boot-2009.11

    1、同时支持S3C2410和S3C2440 (2410没板测试) 2、自动识别S3C2440的启动方式,并能够将环境变量的保存到对应的位置 3、支持网卡芯片DM9000 4、支持不同NAND Flash的读写,并自动识别所使用的nand flash是512B/page...

    2400触摸屏驱动代码

    S3C2440 ADC和触摸屏接口有 等待中断模式 的特性。所以需要编写一个中断函数,来完成ADC数据的读取。 以下代码在ucos移植版上测试通过

    leetcode分类-architects-corner:建筑师的角落

    S3 EC2 SQS/Kinesis Queue Java Java版 JDK X 中发布的功能 JDK 8 和 JDK 9 JDK 8 和 9 JDK 9 JDK 9 JDK9 的 55 个新特性 JDK 10 JDK 10 JDK 9、10 和 11 JDK 10 JDK 10 JDK 10 JDK 11 JDK 11 Java 堆栈 名称 描述 ...

    Ho3+掺杂硫卤玻璃陶瓷的中红外发光特性的研究

    在不同热处理工艺条件下制备了掺Ho3+(质量分数为0.6%)的65GeS2-25Ga2S3-10CsI (其各成份的摩尔分数为65%,25%,10%)硫卤玻璃陶瓷,测试了其密度、显微硬度、红外透射光谱、以及中红外荧光光谱,对比研究了基质玻璃与玻璃...

    元器件应用中的LTC2207在ARM与FPGA控制下的采集应用

    摘要:参考数字式超低频宽带频率特性测试仪中的相关技术指标,采用了凌力尔特公司的LTC2207芯片对数据进行采集。本文描述了LTC2207芯片的功能特性、时序控制方式和基本工作原理,在S3C2440和EP3C25处理器的控制下...

    基于uCOSⅡ和CH375的U盘数据读写接口设计

    该方案以数字频率特性测试仪为应用背景,给出了具体应用电路。软件设计基于嵌入式操作系统uCOSⅡ,保证了系统实时性和可扩展性,重点介绍了uCOSⅡ操作系统下的CH375读写方法。该方案在数字频率特性测试仪中运行良好...

    基于$3 C45 10B的嵌入式系统启动设计 (2005年)

    作者剖析了32位微处理器S3C4510B的特性及嵌入式系统的基本结构和启动程序的特性,并详细地论述了启动程序的整个流程以及其中的地址重映射的实现过程和启动代码中异常向量的处理等关键步骤,设计出具有良好模块性和可...

    men-as-promised:MEAN.JS的分支,但没有任何AngularJS前端,并且倾向于使用promises

    承诺的人 MEAN.JS的一个分支,但是AngularJS前端被扯掉了,并承诺而不是回调。 承诺的MEN(mongodb,expressjs,nodejs)被设计为以企业为中心的API的良好起点。...与S3,SES和CloudWatch通话的一些简单服务

    基于嵌入式WinCE的GPIO驱动开发 (2010年)

    嵌入式WinCE是一种适用于嵌入式系统的源码开放的占先式实时多任务操作系统,是目前操作系统...本文简要论述了基于S3C2440嵌入式ARM处理器芯片的嵌入式 WinCE的GPIO驱动程序的开发流程,并应用该驱动编写了测试程序。

    c语言编写单片机技巧

    相关频率特性(AC)测试,也是通过外灌一定频率,从I/O口来看输出是否与之匹配。 &#61548; 为了保证IC生产的长期且稳定品质,还会做产品的可靠性测试,这些测试包括ESD测试,LATCH UP测试,温度循环测试,...

    java简易投票系统源码下载-awesome-rust-cn:Rust生态圈--Rust资源大全:精选的Rust代码和资源列表

    Rust特性 Rust作为新一代系统级编程语言,聚焦内存"安全"、"并发"、"实用"的设计原则。 Rust核心概念是"不可变"、"所有权"、"Trait"。 Rust不玩虚拟机和垃圾回收,通过"不可变"、"所有权",牺牲一定的编程灵活性,...

Global site tag (gtag.js) - Google Analytics