如何使用 google-cloud 客户端将大于 32MB 的文件上传到 GCS?
Posted
技术标签:
【中文标题】如何使用 google-cloud 客户端将大于 32MB 的文件上传到 GCS?【英文标题】:How can I upload a file larger than 32MB to GCS using the google-cloud client? 【发布时间】:2017-02-15 03:41:57 【问题描述】:我最近开始使用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。我已经看到solutions 使用 Blobstore API,但这些都是旧的,而且 Blobstore 甚至不再用于存储数据(尽管 Blobstore API 仍然可以使用)。
所以我想知道,有没有办法使用 google-cloud 客户端解决这个问题?我还没有看到在docs 中创建上传网址的方法。
【问题讨论】:
【参考方案1】:客户端应直接上传到 GCS。来自 GAE 的单个连接不能传输超过 32 MB。
这对您来说应该不是问题,因为您已经在使用 HTML 表单。 https://cloud.google.com/storage/docs/xml-api/post-object
您可能需要将存储桶设为可公开访问,具体取决于您的应用所需的访问权限。否则,您必须在后端生成的 PUT
请求中指定 GoogleAccessId
并提前发送到前端。
上面链接的页面末尾有一个小表单上传示例。
最后,我个人建议使用 AJAX 使用 REST API https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload 上传文件,这将帮助您更轻松地处理错误、重定向和成功。
【讨论】:
JSON API 听起来是个不错的解决方案。所以我想我真的不需要那个谷歌云客户端。谢谢。 嗨,Jorge,你能告诉我如何通过 ajax 使用 JSON API 来上传文件吗?我整天都在阅读文档,但没有找到具体的例子。我只需要朝着正确的方向轻推。干杯以上是关于如何使用 google-cloud 客户端将大于 32MB 的文件上传到 GCS?的主要内容,如果未能解决你的问题,请参考以下文章
将 google-cloud 与 webpack 集成时遇到问题
导出 Firestore 备份数据的云功能。使用 firebase-admin 或 @google-cloud/firestore?
使用 google-cloud 库执行 BigQuery 查询时出现异常
GCP - 无法在 Cloud Run 中使用 Google Secret Manager (@google-cloud/secret-manager)
使用 node.js 标准环境在 AppEngine 上找不到模块 @google-cloud/firestore
使用 Cloud Functions for Firebase 和 @google-cloud/storage 删除图像时出现问题