使用jclouds库在Amazon S3上上传

在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HTML】前端性能优化之CDN和WPO的比较

CDN通过将资源存储在更接近用户的位置&#xff0c;缩短到服务器的往返行程&#xff0c;加快页面加载时间来解决性能问题。WPO解决方案&#xff0c;如Radware的FastView&#xff0c;则在前端进行性能提升处理&#xff0c;使页面更有效地呈现在浏览器中。 “我已经使用了内容交付…

python自动化测试-D1-学习笔记之二

Jmeter 一、Jmeter连接数据库 1、打开Jmeter&#xff0c;在Jmeter—测试计划中添加mysql的jar包&#xff0c;见如下截图&#xff1a; 2、添加好jar包后&#xff0c;添加jdbc&#xff0c;并进行设置&#xff0c;如下图 3、添加JDBC Request&#xff0c;然后在JDBC Request中操作…

Android View 的滑动

一、View 的简介 View是所有可视化控件的基类&#xff0c;我们平时接触的所有的控件&#xff0c;比如说TextView,Button 等等都继承于View。View是Android 在视觉上的呈现&#xff0c;是界面层控件的一种抽象&#xff0c;可以是单个控件也可以是一组控件。 二、坐标系 1、Andro…

ActiveMQ消息优先级:工作原理

关于ActiveMQ的消息优先级支持 &#xff0c; 邮件列表上通常会不断出现一些问题&#xff0c;以及有关观察到的行为和“真正支持什么”的好问题&#xff1f; 我希望可以帮助您了解幕后情况以及可以支持的优先级。 详细信息可能会有些麻烦。 如果您对这些细节不感兴趣&#xff0c…

flask 检测post是否为空_使用Flask搭建一个校园论坛-4

在上一节中完成了注册功能的前期准备工作&#xff0c;在这一节内容中将完成用户注册、登录功能。1.知识预览在本届中将学习到以下内容的知识如何使用wtform来渲染表单如果使用flask-mail来发送邮件2.用户注册在前端中form表单是用的比较多的东西&#xff0c;我们可以使用wtform…

SQL Table 自动生成Net底层-生成数据操作Repository

生成接口类 public static string DataTableToBaseIService(string tableName, string nameSpace, string className){var table SqlTableHelper.GetSQLTableInfo(tableName);StringBuilder reval new StringBuilder();reval.AppendFormat(" using System; using…

CSS3扁平化Loading动画特效

效果预览&#xff1a;http://hovertree.com/texiao/css3/42/ 代码如下&#xff1a; <!doctype html><html><head><meta charset"utf-8"><title>css3旋转加载效果_何问起</title><style>body {background: #263238;backgro…

自定义Spring命名空间使JAXB更容易

首先&#xff0c;让我大声说出来&#xff1a; Spring不再是XML繁重的了 。 事实上&#xff0c;如今&#xff0c;您可以使用大量注释&#xff0c; Java配置和Spring Boot来编写几乎没有XML或根本没有XML的Spring应用程序。 认真地停止谈论Spring和XML&#xff0c;这已经成为过去…

sublime text3运行python不显示内容_sublime text 运行python无法出结果

一、python和sublime text 已经安装完毕。二、用sublime text运行python程序得时候出现三、配置Python环境1、打开Tools > Build System > New Build System..2、点击New Build System后&#xff0c;会生成一个空配置文件&#xff0c;在这个配置文件内覆盖配置信息&#…

利用锚点再点事吧丨

上图 接着HTML代码&#xff1a; <div id"color"> <div id"red">红</div> <div id"yellow">黄</div> <div id"black">黑</div> <div id"green">绿</div> </div>…

JavaScript变量声明与提升

一直以来对变量提升都是比较模糊的&#xff0c;今天特地看了一下这个知识点&#xff0c;总结一下。 1、举个最简单的例子来说一下什么是变量提升吧。  function foo(){console.log(x); // undefinedvar x 12;console.log(x) // 12 } foo(); 由于变量声明提升&#xff0c;其…

javaweb笔记1

转载于:https://www.cnblogs.com/webdev8888/p/9164291.html

重复运行JUnit测试而没有循环

最近&#xff0c;我遇到了一个问题&#xff0c;我不得不编写一种方法的测试&#xff0c;该方法需要计算在一定可能性范围内的随机分布值1 。 更准确地说&#xff0c;如果您假设签名看起来像 interface RandomRangeValueCalculator {long calculateRangeValue( long center, lo…

以太网数据帧的报尾封装字段是什么_16、90秒快速“读懂”数据包的封装、解封装...

数据转发过程概述数据包在相同网段内或不同网段之间转发所依据的原理基本一致。一、数据帧封装TCP封装(四层)当主机建立了到达目的地的TCP连接后&#xff0c;便开始对应用层数据进行封装。主机A会对待发送的应用数据首先执行加密和压缩等相关操作&#xff0c;之后进行传输层封装…

MVP模式在Android实际项目中的应用和优化

注&#xff1a;本文阅读需要对MVP模式有基本了解。 MVP模式已经出现有很长一段时间了&#xff0c;但是火起来是这两年的事情。 关于MVP的概览&#xff0c;介绍&#xff0c;乃至于教程&#xff0c;Demo&#xff0c;实例&#xff0c;网上都有很多&#xff0c;我也有一篇文章专门收…

将训练集构建成ImageNet模型

以下程序实现将训练集构建为ImageNet模型&#xff0c;训练集图片为56个民族 import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter;public class createTxt {public static void createClassInd(){//56个…

CSS基本知识(慕课网)

1、注释 注解&#xff1a;CSS中注释/*这里是注释的文字*/ HTML中注释<!--这里是注释的文字--> 2、外部式css样式&#xff0c;写在单独的一个文件中 注解&#xff1a; 外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中&#xff0c;这个css样式文件以“…

JMS和Spring:有时很重要的小事情

JmsTemplate和DefaultMessageListenerContainer是用于访问JMS兼容MOM的Spring帮助器。 他们的主要目标是在JMS API之上形成一层&#xff0c;并处理诸如事务管理/消息确认之类的基础结构&#xff0c;并隐藏JMS API的某些重复和笨拙的部分&#xff08;保留在那里&#xff1a; JMS…

python 音速_webpack多页应用架构系列(十一):预打包Dll,实现webpack音速编译

前言上文说到我们利用webpack来打包一个可配置的bootstrap&#xff0c;但文末留下一个问题&#xff1a;由于bootstrap十分庞大&#xff0c;因此每次编译都要耗费大部分的时间在打包bootstrap这一块&#xff0c;而换来的仅仅是配置的便利&#xff0c;十分不划算。我也并非是故意…

whereis 命令

可以用来查看命令的路径&#xff0c;安装在哪里 whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置 [rootsalt-server-192 a]# whereis mysql mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz 转载于:https://ww…