两件事:
- 我正在尝试在GCS对象签名URL上设置自定义元数据。
- 我试图在GCS对象签名URL上设置最大文件大小。
使用以下代码:
Map<String, String> headers = new HashMap<>();
headers.put("x-goog-meta-" + usernameKey, username);
if (StringUtils.hasText(purpose)) {
headers.put("x-goog-meta-" + purposeKey, purpose);
}
if (maxFileSizeMb != null) {
headers.put("x-goog-content-length-range", String.format("0,%d", maxFileSizeMb * 1048576));
}
List<Storage.SignUrlOption> options = new ArrayList<>();
options.add(Storage.SignUrlOption.httpMethod(HttpMethod.POST));
options.add(Storage.SignUrlOption.withExtHeaders(headers));
String documentId = documentIdGenerator.generateDocumentId().getFormatted();
StorageDocument storageDocument =
StorageDocument.builder().id(documentId).path(getPathByDocumentId(documentId)).build();
storageDocument.setFormattedName(documentId);
SignedUrlData.SignedUrlDataBuilder builder =
SignedUrlData.builder()
.signedUrl(storageInterface.signUrl(gcpStorageBucket, storageDocument, options))
.documentId(documentId)
.additionalHeaders(headers);
首先生成的签名URL有效,我可以上传文档。
现在我期望通过控制台视图看到对象元数据。但是没有元数据集。content-length-range
也不受尊重。当"content-length-range
"设置为"0,1
"时,可以上传1.3 MB的文件。
当我上传一个更大的文件(~ 5 MB)时,发生了一些事情,但是在content-length-range
中。我收到一个错误信息:Metadata part is too large.
.
您可以在这里看到content-length-range
需要最小和最大大小。这个范围使用的单位是字节,正如您在这个例子中看到的。
我也注意到你使用了x-goog-content-length-range
,我找到了这个文档,当使用这个头时要考虑:
- 使用
PUT
请求,否则将被静默忽略。 - 如果请求内容的大小超出指定范围,则请求失败,并在响应中返回400 Bad request代码。
- 你必须设置最小和最大的字节大小。