`

S3-客户端API测试

 
阅读更多

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

 

package amazons3;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.Date;
import java.util.Map;

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

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.httpclient.util.DateUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import sun.misc.BASE64Encoder;

public class S3ClientSimpleTest {

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

	static String accessKey = "your accessKey";
	static String secretKey = "your secretKey";
	static String bucket = "your bucket";

	public static void main(String[] args) throws Exception {
		File localFile = new File("D:/temp/s3testfile.txt");
		putObject(localFile);
		getObject("s3testfile.txt", "d:/temp/download", null, null, null);
	}

	public static void putObject(File localFile) throws Exception {
		HttpURLConnection conn = null;
		BufferedInputStream in = null;
		BufferedOutputStream out = null;
		try {
			URL url = new URL("http://" + bucket + ".s3.amazonaws.com/" + localFile.getName());
			conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("PUT");
			conn.setDoOutput(true);
			conn.setDoInput(true);

			String contentMD5 = md5file(localFile);
			logger.info("ContentMD5: " + contentMD5);
			String contentType = "application/xml";
			Date date = new Date();
			String dateString = DateUtil.formatDate(date, DateUtil.PATTERN_RFC1036);
			String sign = sign("PUT", contentMD5, contentType, dateString, "/" + bucket + "/" + localFile.getName(), null);
			conn.setRequestProperty("Date", dateString);
			conn.setRequestProperty("Authorization", sign);
			conn.setRequestProperty("Content-Type", contentType);
			conn.setRequestProperty("Content-MD5", contentMD5);

			out = new BufferedOutputStream(conn.getOutputStream());
			in = new BufferedInputStream(new FileInputStream(localFile));

			byte[] buffer = new byte[1024];
			int p = 0;
			while ((p = in.read(buffer)) != -1) {
				out.write(buffer, 0, p);
				out.flush();
			}

			int status = conn.getResponseCode();
			logger.info("http status: " + status);
			logger.info("after:\n" + conn.getHeaderFields());

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			close(in);
			close(out);
		}
	}

	public static File getObject(String objectName, String rootPath, Long start, Long end, String etag) {

		HttpURLConnection conn = null;
		BufferedInputStream in = null;
		BufferedOutputStream out = null;
		try {
			URL url = new URL("http://" + bucket + ".s3.amazonaws.com/" + objectName);
			conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setDoOutput(true);

			String contentType = "application/xml";
			Date date = new Date();
			String dateString = DateUtil.formatDate(date, DateUtil.PATTERN_RFC1036);
			String sign = sign("GET", "", contentType, dateString, "/" + bucket + "/" + objectName, null);
			conn.setRequestProperty("Date", dateString);
			conn.setRequestProperty("Authorization", sign);
			conn.setRequestProperty("Content-Type", contentType);

			// Range 特性
			if (start != null && end != null) {
				conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
			}

			// Etag 特性
			if (StringUtils.isNotBlank(etag)) {
				conn.setRequestProperty("If-None-Match", etag);
			}

			int status = conn.getResponseCode();
			logger.info("http status: " + status);
			if (status == 304) {
				// ETAG未变化,文件未变化,服务器返回空body
				logger.info("after:\n" + conn.getHeaderFields());
				return null;
			}

			in = new BufferedInputStream(conn.getInputStream());
			File localFile = new File(rootPath + "/" + objectName);
			if (!localFile.getParentFile().exists()) {
				localFile.getParentFile().mkdirs();
			}
			out = new BufferedOutputStream(new FileOutputStream(localFile, false));

			byte[] buffer = new byte[1024];
			int p = 0;
			while ((p = in.read(buffer)) != -1) {
				out.write(buffer, 0, p);
				out.flush();
			}
			logger.info("after:\n" + conn.getHeaderFields());
			return localFile;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			close(in);
			close(out);
		}

	}

	private static void close(Closeable c) {
		try {
			if (c != null) {
				c.close();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * MD5文件
	 * 
	 * @param file
	 * @return
	 * @throws Exception
	 */
	public static String md5file(File file) throws Exception {
		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);
	}

	/**
	 * 计算签名
	 * 
	 * @param httpVerb
	 * @param contentMD5
	 * @param contentType
	 * @param date
	 * @param resource
	 * @param metas
	 * @return
	 */
	public static String sign(String httpVerb, String contentMD5, String contentType, String date, String resource, Map<String, String> metas) {

		String stringToSign = httpVerb + "\n" + StringUtils.trimToEmpty(contentMD5) + "\n" + StringUtils.trimToEmpty(contentType) + "\n" + date + "\n";
		if (metas != null) {
			for (Map.Entry<String, String> entity : metas.entrySet()) {
				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 "AWS" + " " + accessKey + ":" + signature;
		} catch (Exception e) {
			throw new RuntimeException("MAC CALC FAILED.");
		}

	}

	private 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;
	}

}
分享到:
评论
1 楼 sunjiankirk 2013-07-01  
博主,请教一下,如何指定将file上传到制定的pool中呢?
是在setEndpoint中吗?
我试验不成功啊

相关推荐

    PyPI 官网下载 | aws-s3-resource-0.0.13.tar.gz

    只有一个条目:`aws-s3-resource-0.0.13`,这通常意味着压缩包解压后会有一个名为`aws-s3-resource-0.0.13`的目录,里面包含该库的`setup.py`安装脚本、`README`文档、源代码文件(如`.py`文件)、测试文件、以及...

    PyPI 官网下载 | aws-s3-tools-0.0.2.tar.gz

    6. **数据加密**:可能提供了对S3对象进行服务器端或客户端加密的选项。 7. **预签名URL**:生成短期有效的URL,允许有限时间内的匿名访问或上传。 8. **同步和备份**:定期同步本地文件系统与S3存储桶,实现数据...

    PyPI 官网下载 | mypy-boto3-s3-1.14.55.2.tar.gz

    例如,要创建一个新的S3客户端,可以这样写: ```python from mypy_boto3_s3 import build_s3_client s3_client = build_s3_client() ``` 总的来说,“mypy-boto3-s3”是一个强大的工具,它增强了Boto3的类型安全...

    PyPI 官网下载 | drf_to_s3-0.6.6.tar.gz

    因此,`drf_to_s3`库的主要功能可能是帮助开发者将通过DRF接收到的数据上传到S3存储,或者从S3下载数据并返回给API客户端。 在了解`drf_to_s3`库之前,我们需要先理解几个关键概念: 1. **Django REST Framework ...

    s3客户端

    S3客户端则是用于与S3交互的软件工具,允许用户上传、下载、管理存储在S3上的对象。在这个场景中,我们关注的是一个名为“s3-client”的Go语言实现的S3客户端。 Go语言,也称为Golang,是Google开发的一种静态类型...

    s3-file-uploader:Spring Boot应用程序用于S3文件上传

    6. **Service**: 业务层,封装了与S3交互的逻辑,如创建S3客户端,上传文件。 7. **Model**: 数据模型,可能包括表示S3对象或上传请求的类。 8. **Configuration**: Spring Boot的配置文件,如application....

    Dive-into-AWS-Course---Direct-to-S3-via-Django-[removed]在本节中,我们将实现可重用的Boto3实用程序(https

    18-S3文件的其他客户端数据 19-成功上传后更新后端 20-Django Rest Framework序列化器验证 21-保存模型序列化器 22-HTTP方法的JSON。 23-将策略视图上传为DRF 24-创建API视图和无效数据 25-HTML上传表格 26-原始...

    PyPI 官网下载 | ibm-cos-sdk-s3transfer-2.1.1.tar.gz

    首先,`ibm-cos-sdk-s3transfer`是IBM为Python开发的客户端库,用于高效地处理与IBM Cloud Object Storage交互的任务。此库的版本号为2.1.1,表明它经过了多次迭代和优化,以提供更稳定、功能更强大的服务。这个`....

    rusoto-s3-mpu

    5. ** rusoto-s3-mpu-master**:这个文件名表明这是 Rusoto S3 MPU 项目的主分支源代码,可能包含了该模块的实现、测试、文档和示例。 6. **多线程和并发**:Rusoto 的 MPU 实现可能会利用 Rust 的并发特性,比如...

    apigateway-dg.pdf

    - 提供了多种教程来帮助用户理解如何使用API Gateway来创建不同类型的API,包括如何集成Lambda函数和DynamoDB,如何创建API作为Amazon S3和Kinesis的代理等。 8. **API开发和发布**: - 包括创建HTTP API、路由...

    nodejs-aws-s3-sample

    2. **index.js** 或其他JS文件 - 包含主要的Node.js代码,展示如何初始化AWS SDK,创建S3客户端,以及执行S3操作。 3. **aws.config.js** 或类似配置文件 - 可能包含AWS访问密钥和秘密访问密钥,这些是连接到AWS账户...

    S3特性测试

    在实际工作中,测试人员会使用各种工具,如AWS SDKs(Software Development Kits)进行编程测试,或者使用像S3cmd、Cyberduck这样的图形化客户端进行手动测试。他们还会编写自动化脚本来模拟大量请求,以便在不同的...

    Laravel开发-laravel-apidocs .zip

    13. **测试支持**:Laravel提供全面的单元测试和集成测试支持,包括断言、HTTP客户端和数据库事务回滚等功能,帮助开发者编写健壮的代码。 综上所述,`Laravel开发-laravel-apidocs .zip`压缩包中的内容将涵盖...

    Projet-AppServJava-S3-B

    7. **RESTful API设计**:如果项目涉及到服务端开发,那么很可能提供了REST(Representational State Transfer)风格的API,允许客户端(如Web应用、移动应用)与服务端进行数据交换。 8. **测试与调试**:Java项目...

    yoke.engine.jade-1.0.18.zip

    "s3-spraysupport" 意味着这个项目包含对S3服务的 Spray 客户端支持,使得开发者能够通过Spray轻松地与S3 REST API进行交互,进行上传、下载、管理对象等操作。 【标签】"开源项目" 指出这个资源是开放源代码的,...

    Python库 | mypy-boto3-apigateway-1.14.15.0.tar.gz

    标题中的“mypy-boto3-apigateway-1.14.15.0.tar.gz”指的是一个Python库的压缩包,它包含了`mypy`、`boto3`和`apigateway`相关的类型检查工具和AWS API Gateway的客户端。这个版本号1.14.15.0表示这是该库的一个...

    安卓专项测试 - Python篇实战视频(Android)

    4-17 数据驱动DDT实现API接口自动化测试简介) 4-18 Python requests测试HTTP中的Get、Post请求 4-19 数据驱动DDT实现API接口自动化测试(一) 4-2 什么是API 4-20 数据驱动DDT实现API接口自动化测试(二); 4-3 抓...

    S3 java sdk 文档-使用手册.pdf

    这包括设置通信协议、签名覆盖类型、客户端端点以及S3客户端选项,比如路径样式访问。 - 初始化过程中,需要传入访问密钥ID(accessKeyID)和秘密访问密钥ID(secretAccessKeyID),这些凭证是由对象存储服务创建...

    aws-sdk-s3(c++).rar

    这段代码展示了如何创建一个S3客户端,然后使用`PutObject`方法上传一个对象到S3桶。 8. **安全注意事项**: 使用AWS SDK时,需要妥善保管访问密钥和秘密访问密钥。在生产环境中,通常不建议硬编码这些凭证,而是...

    arn-rest-api

    在这个场景下,JavaScript可能被用来创建客户端或者服务器端的API调用功能,处理ARN相关的逻辑。 从压缩包子文件的文件名称列表 "arn-rest-api-master" 我们可以推断,这是一个Git仓库的主分支(master)的克隆。...

Global site tag (gtag.js) - Google Analytics