如何使用google-cloud客户端将大于32MB的文件上传到GCS?

时间:2017-02-15 03:41:58

标签: python google-app-engine google-cloud-storage google-cloud-python

我最近开始使用google-cloud client,我做了一个小例子(为了清楚起见,我省略/改变了一些东西):

<form id="testform" method="post" enctype="multipart/form-data">
  <p>
    <div>
      <label for="fotos">Some file</label>
    </div>
    <div>
      <input type="file" name="testfile">
    </div>
  </p>
  <input type="submit" value="Submit">
</form>
from google.cloud import storage

class MyHandler(BaseHandler):
    def get(self):
        self.render("test.html")

    def post(self):
        file = self.request.POST["testfile"]
        filename = file.filename # + TimeStamp

        bucket = storage.Client().get_bucket(self.get_bucket_name())
        blob = bucket.blob(filename)

        blob.upload_from_string(data=file.file.read(),
                                content_type=file.type)

        self.write(blob.public_url)

此代码适用于32MB以下的任何内容,但它无法处理较大的文件,因为它们通过应用程序而不是直接通过GCS。我见过使用Blobstore API的solutions,但是那些旧的并且Blobstore甚至不再用于存储数据(尽管仍然可以使用Blobstore API)。

所以我想知道,有没有办法使用google-cloud客户端解决这个问题?我还没有看到在docs中创建上传网址的方法。

1 个答案:

答案 0 :(得分:1)

客户应直接上传到GCS。来自GAE的单个连接无法传输超过32 MB。

这对您来说不是问题,因为您已经在使用HTML表单。 https://cloud.google.com/storage/docs/xml-api/post-object

根据您的应用所需的访问权限,您可能必须公开访问该存储桶。否则,您必须在后端生成的GoogleAccessId请求中指定PUT并事先发送到前端。

上面链接的页面末尾有一个小表单上传示例。

最后,我个人建议使用AJAX上传您的文件使用REST API https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload这将帮助您更轻松地处理错误,重定向和成功。