如何更改GCS存储桶中单个对象的存储类?

时间:2019-01-17 06:58:15

标签: c# google-cloud-platform google-cloud-storage

我目前正在尝试编写一些代码,以将Google存储桶中的某些“区域”对象转换为“冷线”,但是我遇到了以下异常:

  

{服务存储已引发异常:Google.GoogleApiException:Google.Apis.Requests.RequestError   无效的参数[400]   错误[     消息[无效参数]位置[-]原因[无效]域[全局]   ]

     

在Google.Apis.Requests.ClientServiceRequest 1.ParseResponse(HttpResponseMessage response) in C:\Apiary\support1351\Src\Support\Google.Apis\Requests\ClientServiceRequest.cs:line 192 at Google.Apis.Requests.ClientServiceRequest 1.Execute()在C:\ Apiary \ support1351 \ Src \ Support \ Google.Apis \ Requests \ ClientServiceRequest.cs:line 116      在C:\ work \ teams-api \ Example \ Example.Example.Core.Google \ GoogleStorageHandler.cs:line 365}中的Example.Core.Google.GoogleStorageHandler.Archive()中

我的代码如下:

StorageClient _storageClient;

string storageBucket = "testBucket";
string storageKey = "testFile";

// Test object setup code (added for this question to make the sample more complete)
using (var stream = new MemoryStream(new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4 }))
{
    _storageClient.UploadObject(storageBucket, storageKey, null, stream);
}
// End of setup code

var objectData = _storageClient.GetObject(storageBucket, storageKey);
if (!string.Equals(objectData.StorageClass, "coldline", StringComparison.InvariantCultureIgnoreCase))
{
    objectData.StorageClass = "coldline";
    _storageClient.UpdateObject(objectData); // exception thrown here
}

我已经确认可以对同一对象的元数据进行其他更改(例如,将objectData.StorageClass替换为objectData.ContentType),但是不能更改存储类。我发现听起来很相关的唯一问题是this one,导致了同样的错误。不幸的是,我使用的是Jon建议的SDK的固定版本(2.2.1),因此似乎不是同一问题。我也尝试使用最新的预发行版本(2.3.0-beta04),但没有任何改善。

我可以通过gsutil更改对象的StorageClass类,如果我在get object help page上轮询对象,就会反映出来。如果我尝试使用相同的storageClasspatch it,则可以使用。如果我尝试更改storageClass,它将失败并显示以下400错误:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalid",
    "message": "Invalid argument"
   }
  ],
  "code": 400,
  "message": "Invalid argument"
 }
}

鉴于gsutil可以更改它,我倾向于相信我应该能够通过SDK或API,但我不能。 This page指出storageClass字段是可写的。我是否还缺少其他需要包含的数据?似乎没有对UpdateObject有用的重载,这会影响我的情况。

1 个答案:

答案 0 :(得分:4)

基于this documentation,我认为您不能直接使用补丁或更新来更新存储类。相反,您需要对该对象执行重写操作。

我们目前不直接在Google.Cloud.Storage.V1中公开重写,但是您应该能够使用基础服务:

var obj = new Google.Apis.Storage.v1.Data.Object { StorageClass = "coldline" };
client.Service.Objects.Rewrite(obj, bucketName, objectName, bucketName, objectName).Execute();