使用C#问题将图像上传到Azure Blob存储

时间:2019-10-08 00:26:47

标签: c# azure-storage-blobs

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

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

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!");
        }
    }
}

3 个答案:

答案 0 :(得分:1)

问题在于,您正在调用的大多数Azure SDK方法都是 async ,但您不是正在等待。因此,它们基本上都是生死攸关

答案 1 :(得分:0)

我创建了一个控制台应用程序,并且一切正常,您可以检查代码(我使用的软件包为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();
        }
    }
}

enter image description here

注释:

WindowsAzure.Storage(最新版本为v9.3.2)是我们一直使用的旧版Storage SDK,而Microsoft.Azure.Storage.*(最新版本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。

答案 2 :(得分:0)

您使用的API错误。您必须> -1所有返回await的API方法。第一步是使您的Task方法Main(这是C#7.1的功能)。

async

(要使用static async Task Main() ,您还需要在源文件的顶部添加Task。)

接下来,您需要using System.Threading.Tasks;所有异步方法:

await

成为

container.CreateIfNotExistsAsync();

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

您还必须等待awaitcontainer.SetPermissionsAsync。但是,如果您忘记在另一个blob.UploadFromFileAsync方法中使用await方法async(在您的情况下为async),则会收到编译器警告,因此您应该注意是否出错