亚马逊s3的使用方法_使用jclouds库在Amazon S3上上传
亞馬遜s3的使用方法
在Java世界中,有幾種很好的方法可以將內(nèi)容上傳到S3存儲(chǔ)桶-在本文中,我們將研究jclouds庫(kù)為此提供的功能。 要使用jclouds –特別是本文中討論的API,應(yīng)將此簡(jiǎn)單的Maven依賴項(xiàng)添加到項(xiàng)目的pom中:
1.上載到Amazon S3
為了訪問(wèn)這些API中的任何一個(gè),第一步是創(chuàng)建一個(gè)BlobStoreContext :
BlobStoreContext context =ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials).buildView(BlobStoreContext.class);這表示常規(guī)鍵值存儲(chǔ)服務(wù)(例如Amazon S3)的切入點(diǎn),但不僅限于此。 對(duì)于僅用于S3的更具體的實(shí)現(xiàn),可以類似地創(chuàng)建上下文:
BlobStoreContext context =ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials).buildView(S3BlobStoreContext.class);更具體地說(shuō):
BlobStoreContext context =ContextBuilder.newBuilder('aws-s3').credentials(identity, credentials).buildView(AWSS3BlobStoreContext.class);當(dāng)不再需要經(jīng)過(guò)身份驗(yàn)證的上下文時(shí),需要關(guān)閉它以釋放與其關(guān)聯(lián)的所有資源(線程和連接)。
2. jclouds的四個(gè)S3 API
jclouds庫(kù)提供了四種不同的API來(lái)將內(nèi)容上傳到S3存儲(chǔ)桶,范圍從簡(jiǎn)單但不靈活到復(fù)雜而強(qiáng)大,所有這些都是通過(guò)BlobStoreContext獲得的。 讓我們從最簡(jiǎn)單的開始。
2.1。 通過(guò)Map API上傳
jclouds與S3存儲(chǔ)桶進(jìn)行交互的最簡(jiǎn)單方法是將該存儲(chǔ)桶表示為Map。 該API是從上下文中獲取的:
InputStreamMap bucket = context.createInputStreamMap('bucketName');然后,上傳一個(gè)簡(jiǎn)單HTML文件:
bucket.putString('index1.html', '<html><body>hello world1</body></html>');InputStreamMap API公開了其他幾種PUT操作-文件和原始字節(jié)-單個(gè)和批量。 可以使用一個(gè)簡(jiǎn)單的集成測(cè)試作為示例:
@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。 通過(guò)BlobMap上傳
使用簡(jiǎn)單的Map API很簡(jiǎn)單,但最終會(huì)受到限制-例如,無(wú)法傳遞有關(guān)要上傳內(nèi)容的元數(shù)據(jù)。 當(dāng)需要更大的靈活性和定制功能時(shí),通過(guò)Map將數(shù)據(jù)上傳到S3的這種簡(jiǎn)化方法已不再足夠。 我們將要看的下一個(gè)API是Blob Map API,它是從上下文中獲得的:
BlobMap bucket = context.createBlobMap('bucketName');該API允許客戶端訪問(wèn)更多較低級(jí)別的詳細(xì)信息,例如Content – Length , Content-Type , Content-Encoding , eTag哈希等。 在存儲(chǔ)桶中上傳新內(nèi)容:
Blob blob = bucket.blobBuilder().name('index2.html').payload('<html><body>hello world2</body></html>').contentType('text/html').calculateMD5().build();API還允許在創(chuàng)建請(qǐng)求上設(shè)置各種有效負(fù)載。 一個(gè)簡(jiǎn)單的集成測(cè)試,用于通過(guò)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。 通過(guò)BlobStore上傳
以前的API無(wú)法使用分段上傳來(lái)上傳內(nèi)容-這使它們不適用于處理大文件。 我們將要研究的下一個(gè)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());有效負(fù)載生成器與BlobMap API所使用的生成器相同,因此可以在此處指定有關(guān)blob的較低級(jí)元數(shù)據(jù)信息時(shí)具有相同的靈活性。 區(qū)別在于API的PUT操作支持的PutOptions –即多部分支持 。 現(xiàn)在,先前的集成測(cè)試已啟用多部分功能:
@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。 通過(guò)AsyncBlobStore上傳
雖然以前的BlobStore API是同步的,但還有一個(gè)針對(duì)BlobStore 的異步API – AsyncBlobStore 。 該API同樣是從上下文中獲得的:
AsyncBlobStore blobStore = context.getAsyncBlobStore();兩者之間的唯一區(qū)別是異步API為PUT異步操作返回了ListenableFuture :
Blob blob = blobStore.blobBuilder('index4.html')..payload('<html><body>hello world4</body></html>').build(); blobStore.putBlob('bucketName', blob)<strong>.get()</strong>;顯示此操作的集成測(cè)試類似于同步操作:
@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.結(jié)論
在本文中,我們分析了jclouds庫(kù)提供的用于將內(nèi)容上傳到Amazon S3的四個(gè)API 。 這四個(gè)API是通用的 ,它們還可以與其他鍵值存儲(chǔ)服務(wù)(例如Microsoft Azure Storage)一起使用。 在下一篇文章中,我們將研究jclouds中可用的特定于Amazon的S3 API – AWSS3Client 。 我們將實(shí)現(xiàn)上傳大文件的操作,動(dòng)態(tài)地計(jì)算任何給定文件的最佳零件數(shù),并并行執(zhí)行所有零件的上傳。
參考:在j3s 庫(kù)中,從JCG合作伙伴 Eugen Paraschiv 的jclouds庫(kù) 上載到baeldung博客。
翻譯自: https://www.javacodegeeks.com/2013/04/upload-on-amazon-s3-with-the-jclouds-library.html
亞馬遜s3的使用方法
總結(jié)
以上是生活随笔為你收集整理的亚马逊s3的使用方法_使用jclouds库在Amazon S3上上传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓雅虎天气1.30.61(安卓雅虎)
- 下一篇: jackson使用_如何在Jackson