【问题标题】:Uploading images to azure blob storage with c# issue使用 c# 问题将图像上传到 azure blob 存储
【发布时间】:2019-10-08 20:21:52
【问题描述】:

我编写了一个小控制台应用程序,将本地计算机上文件夹中的文件上传到 Azure blob 存储,我的问题是代码编译并运行没有错误,但我没有得到预期的结果。

我希望 FolderPath 中的所有文件都上传到容器,如果容器不存在来创建它,但它永远不会被创建,控制台告诉我所有内容都在上传。那时我对代码的期望可能不正确。

using System;
using System.IO;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Blob.Protocol;

namespace AzureBlobs
{
    class Program
    {

        const string StorageAccountName = "cs72e88a177daeax40edxbf2";
        const string StorageAccountKey = "[ACCOUNT KEY]";
        const string FolderPath = @"[LOCAL FILE PATH]";

        static void Main()
        {
            var storageAccount = new CloudStorageAccount(new StorageCredentials(StorageAccountName, StorageAccountKey), true);

            var blobclient = storageAccount.CreateCloudBlobClient();

            var container = blobclient.GetContainerReference("newcontainer");

            container.CreateIfNotExistsAsync();

            container.SetPermissionsAsync(new BlobContainerPermissions()
            {
                PublicAccess = BlobContainerPublicAccessType.Blob
            });

            foreach( var filePath in Directory.GetFiles(FolderPath, "*.*", SearchOption.AllDirectories))
            {
                var blob = container.GetBlockBlobReference(filePath);
                blob.UploadFromFileAsync(filePath);

                Console.WriteLine("Uploaded {0}", filePath);
            }

            Console.WriteLine("Donzos!");
        }
    }
}

【问题讨论】:

    标签: c# azure-blob-storage


    【解决方案1】:

    问题在于,您调用的大多数 Azure SDK 方法都是异步,但您并没有等待它们。所以它们基本上都是一劳永逸

    【讨论】:

    • 我真的认为你是对的。那么我该如何解决呢?当我尝试删除“异步”位并使用 container.CreateifNotExists() 时,工作室只是说我们没有那个定义。我需要不同的 SDK 吗?
    • @SonOfNye,你应该使用这里的最新包:nuget.org/packages/Microsoft.Azure.Storage.Blob
    • @SonOfNye 我使用Microsoft.Azure.Storage.Blob 包而不是WindowsAzure.Storage 包。也许这就是原因?
    【解决方案2】:

    您使用的 API 不正确。您必须 await 所有返回 Task 的 API 方法。第一步是让你的Main 方法async(这是C# 7.1 的一个特性)。

    static async Task Main()
    

    (要使用Task,您还需要在源文件顶部添加using System.Threading.Tasks;。)

    接下来需要await所有异步方法:

    container.CreateIfNotExistsAsync();
    

    变成

    await container.CreateIfNotExistsAsync();
    

    这意味着您的代码只会在容器创建后继续执行。如果没有 await,您的代码会将 API 请求发送到 Azure,但会立即继续执行,而无需等待 Azure 完成请求。

    您还必须等待container.SetPermissionsAsyncblob.UploadFromFileAsync。但是,如果您忘记在另一个 async 方法(在您的情况下为 Main)中使用 awaitasync 方法,则会收到编译器警告,因此您应该注意是否犯了任何错误。

    【讨论】:

      【解决方案3】:

      我创建了一个控制台应用程序,一切正常,你可以检查你的代码(我使用的包是Microsoft.Azure.Storage.Blob),

      using Microsoft.Azure.Storage;
      using Microsoft.Azure.Storage.Blob;
      using System;
      using System.IO;
      
      namespace uploadFilesToStorage
      {
          class Program
          {
              static void Main(string[] args)
              {
                  Console.WriteLine("Lets start upload files to Azure Storage!");
      
                  string folderpath = @"C:\Users\bowmanzh\Pictures\images";
                  var storageAccount = CloudStorageAccount
                      .Parse("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
                  var myClient = storageAccount.CreateCloudBlobClient();
                  var container = myClient.GetContainerReference("case");
                  foreach (var filepath in Directory.GetFiles(folderpath,"*.*",SearchOption.AllDirectories)) {
                      var blockBlob = container.GetBlockBlobReference(filepath);
                      blockBlob.UploadFromFileAsync(filepath);
                  }
      
                  Console.ReadLine();
              }
          }
      }
      

      注意:

      WindowsAzure.Storage(latest is v9.3.2) 是我们一直使用的旧版 Storage SDK,Microsoft.Azure.Storage.*(latest v11.1.0) 是它的新版本。

      查看 Storage .NET SDK 的更新日志。列出这些重要差异/变化的一部分。

      Microsoft.Azure.Storage 将库分为三个部分,Blob、Queue 和 File,这意味着我们可以安装单独的包而不是完整版。

      Microsoft.Azure.Storage不支持Table API,转给Microsoft.Azure.Cosmos.Table

      Microsoft.Azure.Storage 自 9.4.0-preview 起添加了 NetStandard2.0 目标支持,它支持包装在异步 API 上的同步方法。 NetStandard 上的WindowsAzure.Storage 仅具有异步 API。

      【讨论】:

        猜你喜欢
        • 2018-12-17
        • 1970-01-01
        • 2020-01-09
        • 2014-07-22
        • 2020-02-23
        • 2020-01-25
        • 2021-01-16
        • 2015-12-10
        • 2013-04-13
        相关资源
        最近更新 更多