【问题标题】:Upload file using Service Account to Google Cloud Storage bucket that was generated in Google Merchant Center使用服务帐户将文件上传到在 Google Merchant Center 中生成的 Google Cloud Storage 存储分区
【发布时间】:2015-01-08 17:11:48
【问题描述】:

我能够使用以下代码将文件上传到 Google Cloud Storage 存储桶。我手动创建了存储桶。

        String serviceAccountEmail = "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com";

        var certificate = new X509Certificate2(@"C:\...\projectname-xxxxxxxxxxxx.p12", "notasecret", X509KeyStorageFlags.Exportable);
        var scopes = new[] { @"https://www.googleapis.com/auth/devstorage.full_control" };

        ServiceAccountCredential credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountEmail)
            {
                Scopes = scopes
            }.FromCertificate(certificate));

        StorageService service = new StorageService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "Shipment Feed",
        });

        var bucketToUpload = "bucket-created-by-me";
        var newObject = new Google.Apis.Storage.v1.Data.Object()
        {
            Bucket = bucketToUpload,
            Name = "ShipmentFeed.txt"
        };


        FileStream fileStream = null;
        var path = @"C:\...\file.txt";
        fileStream = new FileStream(path, FileMode.Open);
        var uploadRequest = new ObjectsResource.InsertMediaUpload(service, newObject,
           bucketToUpload, fileStream, "text/plain");
        uploadRequest.Upload();

现在,当我尝试将文件上传到由 Google Merchant Center 为同一个 Google 帐户生成的存储桶时遇到了问题。我使用上面的代码,只需从 Settings->Google Cloud Storage

将存储桶名称更改为 Google Merchant Center 提供的值
var bucketToUpload = "merchantxxxxxxx";

此过程没有将文件上传到存储桶(使用 gsutil 测试 - 我的项目中存在存储桶但为空)。为什么我不能上传文件?

【问题讨论】:

  • 返回什么错误,403?如果是这样,您可能需要更改存储桶的 ACL 以向服务帐户授予写入权限。
  • 我无法追踪我是否收到了对我的服务帐户请求的响应 - 你能告诉我如何做到这一点吗?
  • 您正在运行上面的代码,是吗?您是否从 .Upload() 获得异常或返回值?您还可以通过“gsutil config -e”配置 gsutil 以使用服务帐户

标签: c# .net google-api google-cloud-storage google-authentication


【解决方案1】:

您的代码未授权访问 Google Cloud Storage。 创建 ServiceAccountCredential 后,必须通过调用获取 Access Token:

 ServiceAccountCredential sac = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountEmail)
            {
                Scopes = scopes
            }.FromCertificate(certificate));
 var cts = new CancellationToken();
 var response = sac.RequestAccessTokenAsync(cts).Result;

如果响应为真,您的 ServiceAccountCredential 对象将设置 ServiceAccountCredential.Token.AccessToken

那么,当你创建你的uploadRequest时,你必须提供你获得的AccessToken:

var uploadRequest = new ObjectsResource.InsertMediaUpload(service, newObject,
       bucketToUpload, fileStream, "text/plain");

uploadRequest.OauthToken = sac.Token.AccessToken;

最后调用:

uploadRequest.Upload();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多