在c#中将对象上传到谷歌云存储桶

时间:2014-10-04 19:45:40

标签: c# google-cloud-storage

有人可以提供一个示例,说明如何使用Google.Apis.Storage.v1将文件上传到c#中的google云存储?

8 个答案:

答案 0 :(得分:10)

我发现这个基本操作并不像你想象的那样直截了当。谷歌关于它的存储API的文档缺乏有关在C#(或任何其他.NET语言)中使用它的信息。在c#中搜索“如何将文件上传到Google云存储”并没有完全帮助我,所以这是我的工作解决方案,并附有一些评论:

<强>制备

  1. 您需要在Google Developers Console中创建OAuth2帐户 - 转到Project / API&amp; AUTH /证书。

  2. 复制客户端ID&amp;客户端对您的代码的秘密。您还需要您的项目名称。

  3. 代码(假设您已通过NuGet添加了Google.Apis.Storage.v1):

    首先,您需要授权您的请求:

    var clientSecrets = new ClientSecrets();
    clientSecrets.ClientId = clientId;
    clientSecrets.ClientSecret = clientSecret;
    //there are different scopes, which you can find here https://cloud.google.com/storage/docs/authentication
    var scopes = new[] {@"https://www.googleapis.com/auth/devstorage.full_control"};
    
    var cts = new CancellationTokenSource();
    var userCredential = await GoogleWebAuthorizationBroker.AuthorizeAsync(clientSecrets,scopes, "yourGoogle@email", cts.Token);
    

    有时您可能还想通过以下方式刷新授权令牌:

    await userCredential.RefreshTokenAsync(cts.Token);
    

    您还需要创建存储服务:

    var service = new Google.Apis.Storage.v1.StorageService();
    

    现在您可以向Google Storage API发出请求。 让我们从创建一个新桶开始:

    var newBucket = new Google.Apis.Storage.v1.Data.Bucket()
    {
        Name = "your-bucket-name-1"
    };
    
    var newBucketQuery = service.Buckets.Insert(newBucket, projectName);
    newBucketQuery.OauthToken = userCredential.Result.Token.AccessToken;
    //you probably want to wrap this into try..catch block
    newBucketQuery.Execute();
    

    它已经完成了。现在,您可以发送请求以获取所有存储桶的列表:

    var bucketsQuery = service.Buckets.List(projectName);
    bucketsQuery.OauthToken = userCredential.Result.Token.AccessToken;
    var buckets = bucketsQuery.Execute();
    

    上一部分上传新文件

    //enter bucket name to which you want to upload file
    var bucketToUpload = buckets.Items.FirstOrDefault().Name;
    var newObject = new Object()
    {
        Bucket = bucketToUpload,
        Name = "some-file-"+new Random().Next(1,666)
    };
    
    FileStream fileStream = null;
    try
    {
        var dir = Directory.GetCurrentDirectory();
        var path = Path.Combine(dir, "test.png");
        fileStream = new FileStream(path, FileMode.Open);
        var uploadRequest = new Google.Apis.Storage.v1.ObjectsResource.InsertMediaUpload(service, newObject,
        bucketToUpload,fileStream,"image/png");
        uploadRequest.OauthToken = userCredential.Result.Token.AccessToken;
        await uploadRequest.UploadAsync();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        if (fileStream != null)
        {
            fileStream.Dispose();
        }
    }
    

    和bam!新文件将显示在所选存储桶内的Google Developers Console中。

答案 1 :(得分:4)

您可以通过以下方式使用不带SDK的Google Cloud API:

  1. 必需的api-key.json文件
  2. 安装软件包Google.Apis.Auth.OAuth2以便授权 HTTP Web请求
  3. 您可以在此设置应用程序的默认配置 方式
  4. 我使用.NET Core Web API进行了相同的操作,详细信息如下:

网址详细信息:

“ GoogleCloudStorageBaseUrl”:“ https://www.googleapis.com/upload/storage/v1/b/”,   “ GoogleSpeechBaseUrl”:“ https://speech.googleapis.com/v1/operations/”,   “ GoogleLongRunningRecognizeBaseUrl”:“ https://speech.googleapis.com/v1/speech:longrunningrecognize”,   “ GoogleCloudScope”:“ https://www.googleapis.com/auth/cloud-platform”,

public void GetConfiguration()
    {
        // Set global configuration
        bucketName = _configuration.GetValue<string>("BucketName");
        googleCloudStorageBaseUrl = _configuration.GetValue<string>("GoogleCloudStorageBaseUrl");
        googleSpeechBaseUrl = _configuration.GetValue<string>("GoogleSpeechBaseUrl");
        googleLongRunningRecognizeBaseUrl = _configuration.GetValue<string>("GoogleLongRunningRecognizeBaseUrl");

        // Set google cloud credentials
        string googleApplicationCredentialsPath = _configuration.GetValue<string>("GoogleCloudCredentialPath");
        using (Stream stream = new FileStream(googleApplicationCredentialsPath, FileMode.Open, FileAccess.Read))
            googleCredential = GoogleCredential.FromStream(stream).CreateScoped(_configuration.GetValue<string>("GoogleCloudScope"));

    }

获取Oauth令牌:

public string GetOAuthToken()
    {
        return googleCredential.UnderlyingCredential.GetAccessTokenForRequestAsync("https://accounts.google.com/o/oauth2/v2/auth", CancellationToken.None).Result;
    }

要将文件上传到云存储桶:

public async Task<string> UploadMediaToCloud(string filePath, string objectName = null)
    {
        string bearerToken = GetOAuthToken();

        byte[] fileBytes = File.ReadAllBytes(filePath);
        objectName = objectName ?? Path.GetFileName(filePath);

        var baseUrl = new Uri(string.Format(googleCloudStorageBaseUrl + "" + bucketName + "/o?uploadType=media&name=" + objectName + ""));

        using (WebClient client = new WebClient())
        {
            client.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + bearerToken);
            client.Headers.Add(HttpRequestHeader.ContentType, "application/octet-stream");

            byte[] response = await Task.Run(() => client.UploadData(baseUrl, "POST", fileBytes));
            string responseInString = Encoding.UTF8.GetString(response);
            return responseInString;
        }
    }

要对云API执行任何操作,只需按照要求发出HttpClient获取/发布请求即可。

谢谢

答案 2 :(得分:3)

这适用于Google.Cloud.Storage.V1(不是Google.Apis.Storage.v1),但现在执行上传似乎更简单一些。我从Client libraries "Getting Started" instructions开始创建服务帐户和存储桶,然后进行实验以了解如何上传图像。

我遵循的流程是:

  1. Sign up用于Google Cloud免费试用
  2. 在Google Cloud中创建一个新项目(请记住项目名称\ ID以供日后使用)
  3. Create a Project Owner service account - 这将导致下载包含服务帐户凭据的json文件。记住放置该文件的位置。
  4. 入门文档让您将JSON凭证文件的路径添加到名为GOOGLE_APPLICATION_CREDENTIALS的环境变量中 - 我无法通过提供的说明进行操作。事实证明它不是必需的,因为您可以将JSON文件读入字符串并将其传递给客户端构造函数。
  5. 我创建了一个空的WPF项目作为起点,并创建了一个ViewModel来容纳应用程序逻辑。
  6. 安装Google.Cloud.Storage.V1 nuget包,它应该引入所需的所有依赖项。
  7. 代码。

    MainWindow.xaml

    <StackPanel>
        <Button
            Margin="50"
            Height="50"
            Content="BEGIN UPLOAD"
            Click="OnButtonClick" />
        <ContentControl
            Content="{Binding Path=ProgressBar}" />
    </StackPanel>
    

    MainWindow.xaml.cs

    public partial class MainWindow
    {
        readonly ViewModel _viewModel;
    
        public MainWindow()
        {
            _viewModel = new ViewModel(Dispatcher);
            DataContext = _viewModel;
            InitializeComponent();
        }
    
        void OnButtonClick(object sender, RoutedEventArgs args)
        {
            _viewModel.UploadAsync().ConfigureAwait(false);
        }
    }
    

    ViewModel.cs

    public class ViewModel
    {
        readonly Dispatcher _dispatcher;
    
        public ViewModel(Dispatcher dispatcher)
        {
            _dispatcher = dispatcher;
            ProgressBar = new ProgressBar {Height=30};
        }
    
        public async Task UploadAsync()
        {
            // Google Cloud Platform project ID.
            const string projectId = "project-id-goes-here";
    
            // The name for the new bucket.
            const string bucketName = projectId + "-test-bucket";
    
            // Path to the file to upload
            const string filePath = @"C:\path\to\image.jpg";
    
            var newObject = new Google.Apis.Storage.v1.Data.Object
            {
                Bucket = bucketName,
                Name = System.IO.Path.GetFileNameWithoutExtension(filePath),
                ContentType = "image/jpeg"
            };
    
            // read the JSON credential file saved when you created the service account
            var credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromJson(System.IO.File.ReadAllText(
                @"c:\path\to\service-account-credentials.json"));
    
            // Instantiates a client.
            using (var storageClient = Google.Cloud.Storage.V1.StorageClient.Create(credential))
            {
                try
                {
                    // Creates the new bucket. Only required the first time.
                    // You can also create buckets through the GCP cloud console web interface
                    storageClient.CreateBucket(projectId, bucketName);
                    System.Windows.MessageBox.Show($"Bucket {bucketName} created.");
    
                    // Open the image file filestream
                    using (var fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Open))
                    {
                        ProgressBar.Maximum = fileStream.Length;
    
                        // set minimum chunksize just to see progress updating
                        var uploadObjectOptions = new Google.Cloud.Storage.V1.UploadObjectOptions
                        {
                            ChunkSize = Google.Cloud.Storage.V1.UploadObjectOptions.MinimumChunkSize
                        };
    
                        // Hook up the progress callback
                        var progressReporter = new Progress<Google.Apis.Upload.IUploadProgress>(OnUploadProgress);
    
                        await storageClient.UploadObjectAsync(
                                newObject, 
                                fileStream,
                                uploadObjectOptions,
                                progress: progressReporter)
                            .ConfigureAwait(false);
                    }
    
                }
                catch (Google.GoogleApiException e)
                    when (e.Error.Code == 409)
                {
                    // When creating the bucket - The bucket already exists.  That's fine.
                    System.Windows.MessageBox.Show(e.Error.Message);
                }
                catch (Exception e)
                {
                    // other exception
                    System.Windows.MessageBox.Show(e.Message);
                }
            }
        }
    
        // Called when progress updates
        void OnUploadProgress(Google.Apis.Upload.IUploadProgress progress)
        {
            switch (progress.Status)
            {
                case Google.Apis.Upload.UploadStatus.Starting:
                    ProgressBar.Minimum = 0;
                    ProgressBar.Value = 0;
    
                    break;
                case Google.Apis.Upload.UploadStatus.Completed:
                    ProgressBar.Value = ProgressBar.Maximum;
                    System.Windows.MessageBox.Show("Upload completed");
    
                    break;
                case Google.Apis.Upload.UploadStatus.Uploading:
                    UpdateProgressBar(progress.BytesSent);
    
                    break;
                case Google.Apis.Upload.UploadStatus.Failed:
                    System.Windows.MessageBox.Show("Upload failed"
                                                   + Environment.NewLine
                                                   + progress.Exception);
                    break;
            }
        }
    
        void UpdateProgressBar(long value)
        {
            _dispatcher.Invoke(() => { ProgressBar.Value = value; });
        }
    
        // probably better to expose progress value directly and bind to 
        // a ProgressBar in the XAML
        public ProgressBar ProgressBar { get; }
    }
    

答案 3 :(得分:2)

使用Google.Apis.Storage.v1通过SDK将文件上传到c#中的Google云存储:

  1. 必需的api-key.json文件

  2. 安装软件包Google.Cloud.Storage.V1;和Google.Apis.Auth.OAuth2;

  3. 下面提供了将文件上传到云端的代码

    line
    1. 设置凭据

      # set the index in line
      df.set_index('line', inplace=True)
      
      #split up the table into the 2 parts to work on
      amount_df = df[df['text'] == 'Amount']
      vat_df = df[df['text'] == 'VAT']
      
      # join the 2 tables to get everything on one row
      df2 = amount_df.join(vat_df, how='outer', on='line', rsuffix='amount', lsuffix='vat')
      
      # do the math
      condition = df2['xvat'] - df2['x2amount'] < 10
      df2 = df2[condition]
      
      df2['text'] = 'Total'
      df2['x'] = df2['xvat'] - (df2['xamount'] - df2['xvat'])
      df2['y'] = df2['yvat'] - (df2['yamount'] - df2['yvat'])
      df2['x2'] = df2['x2vat'] - (df2['x2amount'] - df2['x2vat'])
      df2['y2'] = df2['y2vat'] - (df2['y2amount'] - df2['y2vat'])
      df.append(df2[['text','x','y','x2','y2']])
      

我在一个窗口应用程序中使用了SDK。您可以根据自己的需求/要求使用相同的代码。

答案 4 :(得分:1)

你会很高兴知道它仍然有效2016年... 我使用像谷歌gcp C#上传图片这样的关键词进行谷歌搜索,直到我简单地问了一个问题:“如何使用C#将图像上传到谷歌桶”......我在这里。我删除了用户凭据中的.Result,这是对我有用的最终编辑。

            // ******

    static string bucketForImage = ConfigurationManager.AppSettings["testStorageName"];
    static string projectName = ConfigurationManager.AppSettings["GCPProjectName"];

            string gcpPath = Path.Combine(Server.MapPath("~/Images/Gallery/"), uniqueGcpName + ext);
            var clientSecrets = new ClientSecrets();
            clientSecrets.ClientId = ConfigurationManager.AppSettings["GCPClientID"];
            clientSecrets.ClientSecret = ConfigurationManager.AppSettings["GCPClientSc"];

            var scopes = new[] { @"https://www.googleapis.com/auth/devstorage.full_control" };
            var cts = new CancellationTokenSource();
            var userCredential = await GoogleWebAuthorizationBroker.AuthorizeAsync(clientSecrets, scopes, ConfigurationManager.AppSettings["GCPAccountEmail"], cts.Token);
            var service = new Google.Apis.Storage.v1.StorageService();
            var bucketToUpload = bucketForImage;
            var newObject = new Google.Apis.Storage.v1.Data.Object()
            {
                Bucket = bucketToUpload,
                Name = bkFileName
            };

            FileStream fileStream = null;
            try
            {
                fileStream = new FileStream(gcpPath, FileMode.Open);
                var uploadRequest = new Google.Apis.Storage.v1.ObjectsResource.InsertMediaUpload(service, newObject,
                bucketToUpload, fileStream, "image/"+ ext);
                uploadRequest.OauthToken = userCredential.Token.AccessToken;
                await uploadRequest.UploadAsync();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (fileStream != null)
                {
                    fileStream.Dispose();
                }
            }

            // ******

答案 5 :(得分:0)

答案 6 :(得分:0)

以下有两个示例可帮助我使用Google.Cloud.Storage.V1(而非Google.Apis.Storage.v1)将文件上传到Google Cloud Storage中的存储桶:

Upload files to Google cloud storage using c#

Uploading .csv Files to Google Cloud Storage using C# .Net

我都是为了测试而C# Console Application上工作的。

答案 7 :(得分:0)

@2021 年 2 月

string _projectId = "YOUR-PROJECT-ID-GCP"; //ProjectID also present in the json file
GoogleCredential _credential = GoogleCredential.FromFile("credential-cloud-file-123418c9e06c.json");

/// <summary>
/// UploadFile to GCS Bucket
/// </summary>
/// <param name="bucketName"></param>
/// <param name="localPath">my-local-path/my-file-name</param>
/// <param name="objectName">my-file-name</param>
public void UploadFile(string bucketName, string localPath, string objectName)
{
    var storage = StorageClient.Create(_credential);
    using var fileStream = File.OpenRead(localPath);
    storage.UploadObject(bucketName, objectName, null, fileStream);
    Console.WriteLine($"Uploaded {objectName}.");
}

您从 Google 云门户获取凭证 JSON 文件,您可以在该门户中在项目下创建存储桶..