在Java世界中,有几种将内容上载到S3存储桶的好方法–在本文中,我们将研究jclouds库为此提供的功能。 要使用jclouds –特别是本文中讨论的API,应将这种简单的Maven依赖项添加到项目的pom中:
<dependency>
<groupId>org.jclouds</groupId>
<artifactId>jclouds-allblobstore</artifactId>
<version>1.5.9</version>
</dependency>
1.上传到Amazon S3
为了访问这些API中的任何一个,第一步是创建一个BlobStoreContext :
BlobStoreContext context =
ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials)
.buildView(BlobStoreContext.class);
这表示常规键值存储服务(例如Amazon S3)的入口点,但不仅限于此。 对于仅用于S3的更具体的实现,可以类似地创建上下文:
BlobStoreContext context =
ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials)
.buildView(S3BlobStoreContext.class);
更具体地说:
BlobStoreContext context =
ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials)
.buildView(AWSS3BlobStoreContext.class);
当不再需要经过身份验证的上下文时,需要关闭它以释放与其关联的所有资源(线程和连接)。
2. jclouds的四个S3 API
jclouds库提供了四种不同的API来将内容上传到S3存储桶,范围从简单但不灵活到复杂而功能强大,所有这些都是通过BlobStoreContext获得的。 让我们从最简单的开始。
2.1。 通过Map API上传
jclouds与S3存储桶进行交互的最简单方法是将该存储桶表示为Map。 该API是从上下文中获取的:
InputStreamMap bucket = context.createInputStreamMap('bucketName');
然后,上传一个简单HTML文件:
bucket.putString('index1.html', '<html><body>hello world1</body></html>');
InputStreamMap API公开了其他几种PUT操作-文件和原始字节-单个和批量。 可以使用一个简单的集成测试作为示例:
@Test
public void whenFileIsUploadedToS3WithMapApi_thenNoExceptions() {
BlobStoreContext context =
ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials)
.buildView(AWSS3BlobStoreContext.class);
InputStreamMap bucket = context.createInputStreamMap('bucketName');
bucket.putString('index1.html', '<html><body>hello world1</body></html>');
context.close();
}
2.2。 通过BlobMap上传
使用简单的Map API很简单,但最终会受到限制-例如,无法传递有关要上传内容的元数据。 当需要更大的灵活性和定制功能时,这种通过Map将数据上传到S3的简化方法就不再足够了。 我们将要看的下一个API是Blob Map API,它是从上下文中获得的:
BlobMap bucket = context.createBlobMap('bucketName');
该API允许客户端访问更多较低级别的详细信息,例如Content – Length , Content-Type , Content-Encoding , eTag哈希等。 在存储桶中上传新内容:
Blob blob = bucket.blobBuilder().name('index2.html').
payload('<html><body>hello world2</body></html>').
contentType('text/html').calculateMD5().build();
该API还允许在创建请求上设置各种有效负载。 一个简单的集成测试,用于通过Blob Map API将基本HTML文件上传到S3:
@Test
public void whenFileIsUploadedToS3WithBlobMap_thenNoExceptions() throws IOException {
BlobStoreContext context =
ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials)
.buildView(AWSS3BlobStoreContext.class);
BlobMap bucket = context.createBlobMap('bucketName');
Blob blob = bucket.blobBuilder().name('index2.html').
payload('<html><body>hello world2</body></html>').
contentType('text/html').calculateMD5().build();
bucket.put(blob.getMetadata().getName(), blob);
context.close();
}
2.3。 通过BlobStore上传
以前的API无法使用分段上传来上传内容-这使得它们不适用于处理大文件。 我们将要研究的下一个API(同步BlobStore API)解决了此限制。 这是从上下文中获得的:
BlobStore blobStore = context.getBlobStore();
要使用多部分支持并将文件上传到S3:
Blob blob = blobStore.blobBuilder('index3.html').
payload('<html><body>hello world3</body></html>').contentType('text/html').build();
blobStore.putBlob('bucketName', blob, PutOptions.Builder.multipart());
有效负载生成器与BlobMap API所使用的生成器相同,因此可以在此处指定有关blob的较低级元数据信息时具有相同的灵活性。 区别在于API的PUT操作支持的PutOptions –即多部分支持 。 现在,先前的集成测试已启用多部分功能:
@Test
public void whenFileIsUploadedToS3WithBlobStore_thenNoExceptions() {
BlobStoreContext context =
ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials)
.buildView(AWSS3BlobStoreContext.class);
BlobStore blobStore = context.getBlobStore();
Blob blob = blobStore.blobBuilder('index3.html').
payload('<html><body>hello world3</body></html>').contentType('text/html').build();
blobStore.putBlob('bucketName', blob, PutOptions.Builder.multipart());
context.close();
}
2.4。 通过AsyncBlobStore上传
虽然以前的BlobStore API是同步的,但还有一个针对BlobStore 的异步API – AsyncBlobStore 。 该API同样是从上下文中获得的:
AsyncBlobStore blobStore = context.getAsyncBlobStore();
两者之间的唯一区别是异步API为PUT异步操作返回了ListenableFuture :
Blob blob = blobStore.blobBuilder('index4.html').
.payload('<html><body>hello world4</body></html>').build();
blobStore.putBlob('bucketName', blob)<strong>.get()</strong>;
显示此操作的集成测试类似于同步操作:
@Test
public void whenFileIsUploadedToS3WithBlobStore_thenNoExceptions() {
BlobStoreContext context =
ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials)
.buildView(AWSS3BlobStoreContext.class);
BlobStore blobStore = context.getBlobStore();
Blob blob = blobStore.blobBuilder('index4.html').
payload('<html><body>hello world4</body></html>').contentType('text/html').build();
Future<String> putOp = blobStore.putBlob('bucketName', blob, PutOptions.Builder.multipart());
putOp.get();
context.close();
}
3.结论
在本文中,我们分析了jclouds库提供的用于将内容上传到Amazon S3的四个API 。 这四个API是通用的 ,它们还可以与其他键值存储服务(例如Microsoft Azure Storage)一起使用。 在下一篇文章中,我们将研究jclouds中可用的特定于Amazon的S3 API – AWSS3Client 。 我们将执行上传大文件的操作,动态地计算任何给定文件的最佳零件数,并并行执行所有零件的上传。
参考:在ba3d博客上,从JCG合作伙伴 Eugen Paraschiv 使用jclouds库在S3上载 。
翻译自: https://www.javacodegeeks.com/2013/04/upload-on-amazon-s3-with-the-jclouds-library.html