根据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;
}
}
分享到:
相关推荐
只有一个条目:`aws-s3-resource-0.0.13`,这通常意味着压缩包解压后会有一个名为`aws-s3-resource-0.0.13`的目录,里面包含该库的`setup.py`安装脚本、`README`文档、源代码文件(如`.py`文件)、测试文件、以及...
6. **数据加密**:可能提供了对S3对象进行服务器端或客户端加密的选项。 7. **预签名URL**:生成短期有效的URL,允许有限时间内的匿名访问或上传。 8. **同步和备份**:定期同步本地文件系统与S3存储桶,实现数据...
例如,要创建一个新的S3客户端,可以这样写: ```python from mypy_boto3_s3 import build_s3_client s3_client = build_s3_client() ``` 总的来说,“mypy-boto3-s3”是一个强大的工具,它增强了Boto3的类型安全...
因此,`drf_to_s3`库的主要功能可能是帮助开发者将通过DRF接收到的数据上传到S3存储,或者从S3下载数据并返回给API客户端。 在了解`drf_to_s3`库之前,我们需要先理解几个关键概念: 1. **Django REST Framework ...
S3客户端则是用于与S3交互的软件工具,允许用户上传、下载、管理存储在S3上的对象。在这个场景中,我们关注的是一个名为“s3-client”的Go语言实现的S3客户端。 Go语言,也称为Golang,是Google开发的一种静态类型...
6. **Service**: 业务层,封装了与S3交互的逻辑,如创建S3客户端,上传文件。 7. **Model**: 数据模型,可能包括表示S3对象或上传请求的类。 8. **Configuration**: Spring Boot的配置文件,如application....
18-S3文件的其他客户端数据 19-成功上传后更新后端 20-Django Rest Framework序列化器验证 21-保存模型序列化器 22-HTTP方法的JSON。 23-将策略视图上传为DRF 24-创建API视图和无效数据 25-HTML上传表格 26-原始...
首先,`ibm-cos-sdk-s3transfer`是IBM为Python开发的客户端库,用于高效地处理与IBM Cloud Object Storage交互的任务。此库的版本号为2.1.1,表明它经过了多次迭代和优化,以提供更稳定、功能更强大的服务。这个`....
1. **源代码**:包含C语言编写的S3客户端库的源代码,这些代码实现了与S3服务交互的各种API,如上传、下载、列举对象、删除等。 2. **API文档**:可能有文档或README文件,解释如何配置和使用这个库,包括设置访问...
5. ** rusoto-s3-mpu-master**:这个文件名表明这是 Rusoto S3 MPU 项目的主分支源代码,可能包含了该模块的实现、测试、文档和示例。 6. **多线程和并发**:Rusoto 的 MPU 实现可能会利用 Rust 的并发特性,比如...
- 提供了多种教程来帮助用户理解如何使用API Gateway来创建不同类型的API,包括如何集成Lambda函数和DynamoDB,如何创建API作为Amazon S3和Kinesis的代理等。 8. **API开发和发布**: - 包括创建HTTP API、路由...
2. **index.js** 或其他JS文件 - 包含主要的Node.js代码,展示如何初始化AWS SDK,创建S3客户端,以及执行S3操作。 3. **aws.config.js** 或类似配置文件 - 可能包含AWS访问密钥和秘密访问密钥,这些是连接到AWS账户...
在实际工作中,测试人员会使用各种工具,如AWS SDKs(Software Development Kits)进行编程测试,或者使用像S3cmd、Cyberduck这样的图形化客户端进行手动测试。他们还会编写自动化脚本来模拟大量请求,以便在不同的...
13. **测试支持**:Laravel提供全面的单元测试和集成测试支持,包括断言、HTTP客户端和数据库事务回滚等功能,帮助开发者编写健壮的代码。 综上所述,`Laravel开发-laravel-apidocs .zip`压缩包中的内容将涵盖...
7. **RESTful API设计**:如果项目涉及到服务端开发,那么很可能提供了REST(Representational State Transfer)风格的API,允许客户端(如Web应用、移动应用)与服务端进行数据交换。 8. **测试与调试**:Java项目...
"s3-spraysupport" 意味着这个项目包含对S3服务的 Spray 客户端支持,使得开发者能够通过Spray轻松地与S3 REST API进行交互,进行上传、下载、管理对象等操作。 【标签】"开源项目" 指出这个资源是开放源代码的,...
标题中的“mypy-boto3-apigateway-1.14.15.0.tar.gz”指的是一个Python库的压缩包,它包含了`mypy`、`boto3`和`apigateway`相关的类型检查工具和AWS API Gateway的客户端。这个版本号1.14.15.0表示这是该库的一个...
这包括设置通信协议、签名覆盖类型、客户端端点以及S3客户端选项,比如路径样式访问。 - 初始化过程中,需要传入访问密钥ID(accessKeyID)和秘密访问密钥ID(secretAccessKeyID),这些凭证是由对象存储服务创建...
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客户端,然后使用`PutObject`方法上传一个对象到S3桶。 8. **安全注意事项**: 使用AWS SDK时,需要妥善保管访问密钥和秘密访问密钥。在生产环境中,通常不建议硬编码这些凭证,而是...