将文件上传到 GCS - 元数据部分太大
Uploading File to GCS - Metadata part is too large
我们正在尝试使用已签名的 url 将文件上传到 GCS。客户端请求签名的 url 来上传文件,我们的服务器向客户端发送签名的 url。然后客户端使用签名 url 上传文件。这适用于文件大小 < 2MB 的情况。但是 GCS 中对象大小的限制是 5TB。
下面是用于生成签名的代码url
blob = Blob.from_string(filepath, client=gcp_storage_client)
blob.generate_signed_url(version="v4", expiration=datetime.timedelta(minutes=5), method="POST")
我们收到“元数据部分太大”的响应。但是我们没有向文件添加任何元数据。请查看下方 Postman 的屏幕截图。
我在这里做错了什么?我该如何解决?
GCS 有几种上传对象的机制。您使用的是 HTML 形式的“POST 对象”机制。 POST 上传不支持签名 URL。他们使用 signed policy documents 来代替,这有点复杂但有一些额外的功能。
如果您的客户使用的不是人类使用 HTML 表单,我建议使用 PUT object 进行上传。它更简单,并且支持签名 URL。它看起来像这样:
PUT /OBJECT_NAME??X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=whatnot HTTP/1.1
Host: BUCKET_NAME.storage.googleapis.com
Date: DATE
Content-Length: FILE_LENGTH
Content-Type: FILE_MIME_TYPE
Content-MD5: MD5_DIGEST
x-goog-storage-class: DESIRED_STORAGE_CLASS
<file goes here>
我们正在尝试使用已签名的 url 将文件上传到 GCS。客户端请求签名的 url 来上传文件,我们的服务器向客户端发送签名的 url。然后客户端使用签名 url 上传文件。这适用于文件大小 < 2MB 的情况。但是 GCS 中对象大小的限制是 5TB。
下面是用于生成签名的代码url
blob = Blob.from_string(filepath, client=gcp_storage_client)
blob.generate_signed_url(version="v4", expiration=datetime.timedelta(minutes=5), method="POST")
我们收到“元数据部分太大”的响应。但是我们没有向文件添加任何元数据。请查看下方 Postman 的屏幕截图。
我在这里做错了什么?我该如何解决?
GCS 有几种上传对象的机制。您使用的是 HTML 形式的“POST 对象”机制。 POST 上传不支持签名 URL。他们使用 signed policy documents 来代替,这有点复杂但有一些额外的功能。
如果您的客户使用的不是人类使用 HTML 表单,我建议使用 PUT object 进行上传。它更简单,并且支持签名 URL。它看起来像这样:
PUT /OBJECT_NAME??X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=whatnot HTTP/1.1
Host: BUCKET_NAME.storage.googleapis.com
Date: DATE
Content-Length: FILE_LENGTH
Content-Type: FILE_MIME_TYPE
Content-MD5: MD5_DIGEST
x-goog-storage-class: DESIRED_STORAGE_CLASS
<file goes here>