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

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

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

{The service storage has thrown an exception: Google.GoogleApiException: Google.Apis.Requests.RequestError Invalid argument [400] Errors [ Message[Invalid argument] Location[ - ] Reason[invalid] Domain[global] ]

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

我的代码如下:

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 上的对象,这会反射(reflect)出来。 .如果我尝试 patch it使用相同的 storageClass,它可以工作。如果我尝试更改 storageClass,它会失败并显示以下 400 错误:

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

鉴于 gsutil 可以更改它,我倾向于相信我应该能够通过 SDK 或 API 进行更改,但我不能。 This page说明 storageClass 字段是可写的。我是否遗漏了一些我需要包含的其他数据? UpdateObject 似乎没有任何有用的重载会影响我的情况。

最佳答案

基于 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();

关于c# - 如何更改 GCS 存储桶中单个对象的存储类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54230553/

相关文章:

c# - 将枚举写入 csv 文件

c# - 警告 : Can't find dll

google-cloud-platform - 在 Google Secret Manager 中存储二进制数据

kubernetes - GKE 中与 kubernetes 的 TLS 握手超时

python - 从文件夹内的谷歌云存储下载文件

c# - 多个方法,或参数?

c# - 为使用 Xamarin.Forms 构建的 Android 应用程序实现自动更新的正确方法

android - 连接到Firebase Cloud Messaging时出错

google-bigquery - 将 BigQuery 查询结果直接写入 GCS - 可能吗?

python - 如何获取 App Engine 开发服务器上 Google Cloud Storage 文件对象的服务 URL?