Jclouds 分段上传到 Google 云存储失败,出现 400 错误请求
Jclouds multipart upload to Google Cloud Storage failing with 400 Bad Request
我正在构建一个使用 Jclouds(版本 2.1.0)访问 Google 云存储和 upload/download 文件的应用程序。我遇到了分段上传的问题。不确定我是否做错了什么,或者这是一个错误。
我看到的是每当我进行分段上传时,我都会收到“400 Bad Request”响应。这是我用来上传的代码:
String fileContents = Files.toString(new File("google_creds.json"), Charset.defaultCharset());
Supplier<Credentials> credentialSupplier = new GoogleCredentialsFromJson(fileContents);
Iterable<Module> modules = ImmutableSet.<Module>of(
new SLF4JLoggingModule());
BlobStoreContext context = ContextBuilder.newBuilder("google-cloud-storage")
.credentialsSupplier(credentialSupplier)
.modules(modules)
.buildView(BlobStoreContext.class);
BlobStore client = context.getBlobStore();
byte[] testBytes = new byte[102400];
Blob blob = client.blobBuilder("testupload").payload(testBytes)
.contentLength(testBytes.length).build();
// Multipart upload fails
client.putBlob("filecatalyst-unit-tests", blob, multipart());
这是我看到的日志输出:
>> "{"sourceObjects":[{"name":"3fda0043-e340-4ccb-a582-9e3b78cf85e1_00000001","generation":1520026856033315,"objectPreconditions":{"ifGenerationMatch":1520026856033315}}],"destination":{"name":"testupload","size":102400,"contentType":"application/unknown","storageClass":"STANDARD","metadata":{}}}"
>> POST https://www.googleapis.com/storage/v1/b/filecatalyst-unit-tests/o/testupload/compose HTTP/1.1
>> Accept: application/json
>> Authorization: Bearer ***********************
>> Content-Type: application/json
>> Content-Length: 293
<< HTTP/1.1 400 Bad Request
<< Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
<< Server: UploadServer
<< X-GUploader-UploadID: AEnB2UpqKslm87V4wto81YsNphtPFtybHjWgffGAC3XPE-xQAXSjDldst5s5nuWPyhXjEGOwWE5kDETjNA1EedbuEw9Vbe8CtA
<< Vary: X-Origin
<< Vary: Origin
<< Date: Fri, 02 Mar 2018 21:40:56 GMT
<< Content-Type: application/json; charset=UTF-8
<< Content-Length: 178
<< "{[\n]"
<< " "error": {[\n]"
<< " "errors": [[\n]"
<< " {[\n]"
<< " "domain": "global",[\n]"
<< " "reason": "invalid",[\n]"
<< " "message": "Invalid argument"[\n]"
<< " }[\n]"
<< " ],[\n]"
<< " "code": 400,[\n]"
<< " "message": "Invalid argument"[\n]"
<< " }[\n]"
<< "}[\n]"
这是撰写请求的 JSON 正文的格式化版本:
{
"sourceObjects":[
{
"name":"83116375-0ba1-4d1a-aec3-8dd29dab0da9_00000001",
"generation":1520263556434885,
"objectPreconditions":{
"ifGenerationMatch":1520263556434885
}
}
],
"destination":{
"name":"testupload",
"size":33554432,
"contentType":"application/unknown",
"storageClass":"STANDARD",
"metadata":{
}
}
}
尝试了不同大小的文件,我得到了相同的结果。如果我不使用分段上传,它工作正常。
JCLOUDS-1389 跟踪这个问题,jclouds 2.1.1 和 2.2.0 将包含修复。
我正在构建一个使用 Jclouds(版本 2.1.0)访问 Google 云存储和 upload/download 文件的应用程序。我遇到了分段上传的问题。不确定我是否做错了什么,或者这是一个错误。
我看到的是每当我进行分段上传时,我都会收到“400 Bad Request”响应。这是我用来上传的代码:
String fileContents = Files.toString(new File("google_creds.json"), Charset.defaultCharset());
Supplier<Credentials> credentialSupplier = new GoogleCredentialsFromJson(fileContents);
Iterable<Module> modules = ImmutableSet.<Module>of(
new SLF4JLoggingModule());
BlobStoreContext context = ContextBuilder.newBuilder("google-cloud-storage")
.credentialsSupplier(credentialSupplier)
.modules(modules)
.buildView(BlobStoreContext.class);
BlobStore client = context.getBlobStore();
byte[] testBytes = new byte[102400];
Blob blob = client.blobBuilder("testupload").payload(testBytes)
.contentLength(testBytes.length).build();
// Multipart upload fails
client.putBlob("filecatalyst-unit-tests", blob, multipart());
这是我看到的日志输出:
>> "{"sourceObjects":[{"name":"3fda0043-e340-4ccb-a582-9e3b78cf85e1_00000001","generation":1520026856033315,"objectPreconditions":{"ifGenerationMatch":1520026856033315}}],"destination":{"name":"testupload","size":102400,"contentType":"application/unknown","storageClass":"STANDARD","metadata":{}}}"
>> POST https://www.googleapis.com/storage/v1/b/filecatalyst-unit-tests/o/testupload/compose HTTP/1.1
>> Accept: application/json
>> Authorization: Bearer ***********************
>> Content-Type: application/json
>> Content-Length: 293
<< HTTP/1.1 400 Bad Request
<< Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
<< Server: UploadServer
<< X-GUploader-UploadID: AEnB2UpqKslm87V4wto81YsNphtPFtybHjWgffGAC3XPE-xQAXSjDldst5s5nuWPyhXjEGOwWE5kDETjNA1EedbuEw9Vbe8CtA
<< Vary: X-Origin
<< Vary: Origin
<< Date: Fri, 02 Mar 2018 21:40:56 GMT
<< Content-Type: application/json; charset=UTF-8
<< Content-Length: 178
<< "{[\n]"
<< " "error": {[\n]"
<< " "errors": [[\n]"
<< " {[\n]"
<< " "domain": "global",[\n]"
<< " "reason": "invalid",[\n]"
<< " "message": "Invalid argument"[\n]"
<< " }[\n]"
<< " ],[\n]"
<< " "code": 400,[\n]"
<< " "message": "Invalid argument"[\n]"
<< " }[\n]"
<< "}[\n]"
这是撰写请求的 JSON 正文的格式化版本:
{
"sourceObjects":[
{
"name":"83116375-0ba1-4d1a-aec3-8dd29dab0da9_00000001",
"generation":1520263556434885,
"objectPreconditions":{
"ifGenerationMatch":1520263556434885
}
}
],
"destination":{
"name":"testupload",
"size":33554432,
"contentType":"application/unknown",
"storageClass":"STANDARD",
"metadata":{
}
}
}
尝试了不同大小的文件,我得到了相同的结果。如果我不使用分段上传,它工作正常。
JCLOUDS-1389 跟踪这个问题,jclouds 2.1.1 和 2.2.0 将包含修复。