使用jclouds库在Amazon S3上上传
在Java世界中,有幾種將內容上載到S3存儲桶的好方法–在本文中,我們將研究jclouds庫為此提供的功能。 要使用jclouds –特別是本文中討論的API,應將這種簡單的Maven依賴項添加到項目的pom中:
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
總結
以上是生活随笔為你收集整理的使用jclouds库在Amazon S3上上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 了解动态代理:Spring AOP基础
- 下一篇: 教大家win10系统电脑怎么分盘电脑如何