【问题标题】:Unable to upload file to google cloud storage using post method无法使用 post 方法将文件上传到谷歌云存储
【发布时间】:2013-05-04 20:35:10
【问题描述】:

下面是我的代码。我复制了可互操作的访问密钥。客户端和机密都来自同一页面。我在 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)

【问题讨论】:

    标签: google-cloud-storage


    【解决方案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>
    

    我仍然对为什么它以这种方式而不是其他方式工作感到困惑......

    【讨论】:

    • 这太疯狂了
    • 你救了我 :) 我试图解决这个问题已经快 6 个月了。幸运的是我找到了你的帖子。太开心了:)
    • 如果您使用异步 POST 请求,这也是必需的。您必须构建您的 FormData 对象,确保在附加其他字段之后附加上传的文件。
    【解决方案2】:

    要创建存储桶,您需要执行 HTTP PUT:

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

    您的表单方法设置为“POST”。

    【讨论】:

    • 我想使用 HTML 表单将文档上传到 GCS。我已经创建了存储桶,但我无法上传。我尝试了文档中给出的内容(developers.google.com/storage/docs/… 仍然无法正常工作。
    【解决方案3】:

    我找到了上述问题的答案。

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

    在值中,我尝试了 value="Bucket/filename-i-want-to-put" 并且能够看到在存储桶中创建的文件。

    【讨论】:

      【解决方案4】:

      我的解决方案是添加&lt;input type="hidden" name="key" value="${filename}"&gt;

      <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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 2016-12-29
        • 2018-09-15
        相关资源
        最近更新 更多