2014-03-04 18 views
8

在App Engine的服務雲端儲存文件,我可以成爲喜歡用我的應用程序的默認斗的PDF雲端儲存文件:如何使用應用程序引擎SDK

http://storage.googleapis.com/<appid>.appspot.com/<file_name> 

但我怎麼能在SDK中提供當地雲端儲存文件,不使用blob_key?

我寫默認桶這樣的:

gcs_file_name = '/%s/%s' % (app_identity.get_default_gcs_bucket_name(), file_name) 
with gcs.open(gcs_file_name, 'w') as f: 
    f.write(data) 

在SDK =「app_default_bucket」

在SDK的數據存儲的默認存儲分區的名稱我有一種:GsFileInfo表現:filename:/app_default_bucket/example.pdf

更新和解決方法:您可以獲取非圖像文件(如css,js和pdf)的服務網址。

gs_file = '/gs/%s/%s/%s' % (app_identity.get_default_gcs_bucket_name(), folder, filename) 
serving_url = images.get_serving_url(blobstore.create_gs_key(gs_file)) 
+1

你是什麼意思「SDK中的本地雲存儲文件」? –

+0

保存在我的SDK默認存儲桶中的文件。 – voscausa

+0

沒有SDK默認存儲桶。只有您的應用程序具有默認存儲桶。 –

回答

8

更新我發現這個功能使用SDK服務雲端儲存文件:

This feature has not been documented yet.

http://localhost:8080/_ah/gcs/app_default_bucket/filename 

這meands我們不需要IMG服務URL擔任非圖像,如下圖所示! !

要創建電子郵件服務的URL如圖像,CSS,JS和PDF文件的default_bucket,我使用的測試(SDK)和GAE生產驗證碼雲端儲存文件:

重要提示:images.get_serving_url()也適用於SDK中的非圖像!

在SDK中,您將需要blobstore來讀取blob併爲cloudstorage對象創建服務網址。

我還添加了在SDK和GAE生產中讀取,寫入和上傳cloudstorage blob的代碼。

該代碼可以找到here

+0

這不再有效。 – AndroidDev

4

這是你的發展模式從app_identity_stub.py看到價值:

此服務的行爲是一樣的:

APP_DEFAULT_GCS_BUCKET_NAME = 'app_default_bucket' 

在這個文件中解釋的意見作爲生產服務,除了使用 而不是應用程序特定值的恆定值

您應該在生產代碼中得到正確的URL。

編輯:

這是從支持論壇:

在發展模式,app引擎工具模擬本地谷歌雲存儲 服務。該模擬環境中的對象爲非持久性的 ,因此您的應用程序失敗,因爲所需對象 在本地存儲中不存在。如果您首先創建(並且可選地寫入)您嘗試讀取的對象,它應該在dev 模式下正常工作(它對我來說)。當然,生產服務中的對象是 ,因此在生產模式下運行您的應用程序(假設對象已存在)時,不需要額外的步驟。

希望幫助,

馬克谷歌雲存儲團隊

這意味着你必須先寫一個文件,那麼你可以使用它。如果我理解正確,則可以使用任何存儲桶名稱用於此目的,包括「app_default_bucket」。

+0

是的,它在生產中工作正常。但是,在'app_default_bucket'中使用哪個SDK鏈接來提供像example.pdf這樣的文件。 – voscausa

+0

我現在明白了。我更新了我的回覆。 –

+0

感謝您的幫助。但我仍然不明白如何使用它。如何在開發模式下提供文件? – voscausa

0

我之前在這裏找的答案,只是想分享我發現,現在我有它的工作。

可以現在就做這個,這只是有點痛苦。欺騙圖像或blobstore API不受支持,似乎不再工作。

參見:

如果簽上你的網址,你可以給自動過期鏈接到你的內容,匿名或paywalled消費。您不希望以這種方式爲整個網站提供服務,但對於PDF或其他內容,這是一種有效且半安全的選項。

缺少文檔,您可能需要刪除標準擴展標題的換行符。存儲端點會告訴您簽名不良時的預期結果。

而且,您的主機應該是:https://storage-download.googleapis.com/

如果你使用的App Engine,那麼GoogleAccessId是:<項目名稱> @ appspot.gserviceaccount.com

參見:app_identity.get_service_account_name()

如何生成簽名的示例:

from google.appengine.api import app_identity 


def signFile(path, verb='GET', md5='', contentType='', 
      expiration=''): 
    signatureRequest = '{}\n{}\n{}\n{}\n{}'.format(
     verb, md5, contentType, expiration, path) 

    return app_identity.sign_blob(signatureRequest) 

返回一個元組(privateKey, binarySignature)

現在您需要構建URL。簽名應該是base64編碼,然後是urlencoded。有關如何完成構建URL的信息,請參閱以下內容。您應該很可能使用上述的下載主機。

示例URL從文檔:

 
https://storage.googleapis. 
com/example-bucket/[email protected] 
ccount.com&Expires=1458238630&Signature=VVUgfqviDCov%2B%2BKnmVOkwBR2olSbId51kSib 
uQeiH8ucGFyOfAVbH5J%2B5V0gDYIioO2dDGH9Fsj6YdwxWv65HE71VEOEsVPuS8CVb%2BVeeIzmEe8z 
7X7o1d%2BcWbPEo4exILQbj3ROM3T2OrkNBU9sbHq0mLbDMhiiQZ3xCaiCQdsrMEdYVvAFggPuPq%2FE 
QyQZmyJK3ty%2Bmr7kAFW16I9pD11jfBSD1XXjKTJzgd%2FMGSde4Va4J1RtHoX7r5i7YR7Mvf%2Fb17 
zlAuGlzVUf%2FzmhLPqtfKinVrcqdlmamMcmLoW8eLG%2B1yYW%2F7tlS2hvqSfCW8eMUUjiHiSWgZLE 
VIG4Lw%3D%3D 

我希望這可以幫助別人!

噢,你只需要做所有的簽名的東西,如果你的存儲桶不公開(read-all)。

+1

或者:https://github.com/voscausa/appengine-gcs-signed-url/blob/master/sign_url.py – voscausa

相關問題