2013-08-20 66 views
6

我編寫了一個Google App Engine應用程序,該應用程序利用Blobstore保存程序化生成的數據。爲此,我使用了Files API,不幸的是,它不贊成使用Google雲端存儲。所以我正在重寫我的助手類來使用GCS。從其BlobKey獲取Google雲端存儲文件

我想保持界面與以前相似,也是因爲我在數據存儲中保留BlobKeys以保持對文件的引用(並且更改生產應用程序的模型總是很痛苦)。當我保存的東西GCS,我檢索與

BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName()); 

規定here一類BlobKey,我堅持它的數據存儲。

所以這裏的問題:文檔告訴我如何成爲一個GCS與blobstoreService.serve(blobKey, resp);在servlet響應文件,但我怎麼能檢索文件內容(如InputStream中,字節數組或其他)用它在我的代碼進一步處理?在我目前的實施中,我通過從AppEngineFile(兩個已棄用)中讀取FileReadChannel來做到這一點。

回答

3

以下是將Google存儲對象作爲輸入流打開的代碼。不幸的是,你必須使用水桶名稱和對象名稱,而不是Blob鍵

GcsFilename gcs_filename = new GcsFilename(bucket_name, object_name); 
GcsService service = GcsServiceFactory.createGcsService(); 
ReadableByteChannel rbc = service.openReadChannel(gcs_filename, 0); 
InputStream stream = Channels.newInputStream(rbc); 
+0

謝謝!我希望使用BlobKey獲取內容,但如果沒有辦法做到這一點,我會(呃)重構我的模型以包含對象名稱 –

0

你可以得到雲端儲存文件名只在上傳處理程序(fileInfo.gs_object_name)並將其存儲在數據庫中。之後,它就會丟失,並且似乎不會保留在BlobInfo或其他元數據結構中。

谷歌表示: 不同的BlobInfo元FileInfo的元數據不是持久 數據存儲。 (也沒有blob鍵,但如果需要,可以通過調用create_gs_key在以後創建一個 )。必須將gs_object_name名稱 自己保存在上傳處理程序中,否則此數據將丟失。

對不起,這是一個python鏈接,但應該很容易在java中找到類似的東西。 https://developers.google.com/appengine/docs/python/blobstore/fileinfoclass

0

這裏是Blob存儲方式(對不起,這是Python,但我確定你發現它與Java非常相似):

blob_reader = blobstore.BlobReader(blob_key) 
if blob_reader: 
    file_content = blob_reader.read() 
相關問題