当前位置: 首页 > 工具软件 > jclouds > 使用案例 >

使用jclouds库在Amazon S3上上传

安经纶
2023-12-01

在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允许客户端访问更多较低级别的详细信息,例如ContentLengthContent-TypeContent-EncodingeTag哈希等。 在存储桶中上传新内容:

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 的异步APIAsyncBlobStore 。 该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

 类似资料: