2013-05-04 103 views
1

以下是我的代碼。我複製了可互操作的訪問鍵。客戶端和祕密都來自同一頁面。我在表單中使用ClientAccess ID中的客戶端密鑰並進行散列保密。 但我得到錯誤說無效的參數。正在顯示無法使用郵政方法將文件上傳到谷歌雲存儲

詳細誤差作爲「無法創建使用POST桶」

下面是我使用的Python代碼。

import webapp2 
import cgi 
import datetime 
import urllib 
import base64 
import hmac, hashlib 
import sha 


policy_document = '''{"expiration": "2016-06-16T11:11:11Z", 
        "conditions": [ 
         ["starts-with", "$key", "" ], 
         {"acl": "public-read" }, 
        ] 
       }''' 


policy = base64.b64encode(policy_document).strip() 
h = hmac.new('xxx', digestmod=sha.sha) 
h.update(policy) 
signature = base64.b64encode(h.digest()) 


class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.write('<html><body>') 
     self.response.write('<form action="http://storage.googleapis.com/www.xyz.com" method="post" enctype="multipart/form-data">') 
     self.response.write('<input type="text" name="key" value="">') 
     self.response.write('<input type="hidden" name="bucket" value="www.xyz.com">') 
     #self.response.write('<input type="hidden" name="Content-Type" value="image/jpeg">') 
     self.response.write('<input type="hidden" name="GoogleAccessId" value="GOOGxxxxx">') 
     self.response.write('<input type="hidden" name="acl" value="public-read">') 
     self.response.write('<input type="hidden" name="success_action_redirect" value="http://www.linklip.com/storage.html">') 
     self.response.write('<input type="hidden" name="policy" value="%s">' % policy) 
     self.response.write('<input type="hidden" name="signature" value="%s">' % signature) 
     self.response.write('<input name="file" type="file">') 
     self.response.write('<input type="submit" value="Upload">') 
     self.response.write('</form>') 
     self.response.write('</body></html>') 


app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
    ], debug=True) 

回答

0

要創建一個水桶,你需要執行一個HTTP PUT:

https://developers.google.com/storage/docs/reference-methods#putbucket

您的表單方法設置爲 'POST'。

+1

我想使用HTML表單將文檔上傳到GCS。我已經創建了這個存儲桶但我無法上傳。我嘗試了文檔中給出的內容(https://developers.google.com/storage/docs/reference-methods#postobject),但仍然無法正常工作。 – user2131868 2013-05-05 09:58:50

0

我找到了上述問題的答案。

self.response.write('<input type="hidden" name="bucket" value="www.xyz.com">') 

在價值,我想值=「桶/文件名 - 我想做對把」我能夠看到在水桶中創建文件。

1

我有同樣的問題,並嘗試儘可能接近文檔後,我發現什麼是錯的是,我的文件輸入是表單的第一個孩子,而不是在最後。

是否工作:

<form action="https://***.storage.googleapis.com" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file" /> 
    <input type="hidden" name="signature" value="***" /> 
    <input type="hidden" name="key" value="test/alexis.png" /> 
    <input type="hidden" name="policy" value="***" /> 
    <input type="hidden" name="Content-Type" value="image/png" /> 
    <input type="hidden" name="GoogleAccessId" value="***@developer.gserviceaccount.com" /> 
    <input type="hidden" name="bucket" value="***" /> 
    <input type="hidden" name="success_action_status" value="201" /> 
    <input type="submit" value="Upload"> 
</form> 

作品

<form action="https://***.storage.googleapis.com" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="signature" value="***" /> 
    <input type="hidden" name="key" value="test/alexis.png" /> 
    <input type="hidden" name="policy" value="***" /> 
    <input type="hidden" name="Content-Type" value="image/png" /> 
    <input type="hidden" name="GoogleAccessId" value="***@developer.gserviceaccount.com" /> 
    <input type="hidden" name="bucket" value="***" /> 
    <input type="hidden" name="success_action_status" value="201" /> 
    <input type="file" name="file" /> 
    <input type="submit" value="Upload"> 
</form> 

我還在疑惑,爲什麼是這樣工作的,而不是其他...

0

對我來說,解決方案是添加<input type="hidden" name="key" value="${filename}">

<form action="http://container-name.storage.googleapis.com" method="POST" enctype="multipart/form-data"> 
    <input type="hidden" name="acl" value="public-read"> 
    <input type="hidden" name="Content-Type" value="application/pdf"> 
    <input type="hidden" name="key" value="${filename}"> 
    <input type="hidden" name="bucket" value="container-name"> 
    <input type="hidden" name="GoogleAccessId" value="XXXXXXXXX"> 
    <input type="hidden" name="policy" value="XXXXXXXXXXXXXXXXXXXXXXX="> 
    <input type="hidden" name="signature" value="XXXXXX=="> 
    <input type="file" name="file" /> 
    <input type="submit" value="Upload"> 
<form> 

參見Upload file using POST/PUT Object of Google Cloud Storage HTML Form

相關問題