Как загрузить файл в хранилище BLOB-объектов Azure с помощью C #? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть консольное приложение, написанное на C # поверх платформы Core.NET 2.2.

Я хочу изменить свое хранилище с локального хранилища BLOB-объектов Azure.Я загрузил WindowsAzure.Storage для подключения к моей учетной записи Azure.

У меня есть следующий интерфейс

public interface IStorage
{
    Task Create(Stream stram, string path);
}

Я создал следующий интерфейс как фабрика контейнеров BLOB-объектов

public interface IBlobContainerFactory
{
    CloudBlobContainer Get();
}

и вот моя реализация Azure

public class AzureBlobStorage : IStorage
{
    private IBlobContainerFactory ContainerFactory

    public AzureBlobStorage(IBlobContainerFactory containerFactory)
    {
        ContainerFactory = containerFactory;
    }

    public async Task Create(Stream stream, string path)
    {
        CloudBlockBlob blockBlob = ContainerFactory.Get().GetBlockBlobReference(path);

        await blockBlob.UploadFromStreamAsync(stream);
    }
}

Затем в моем файле program.cs я попробовал следующее

if (Configuration["Default:StorageType"].Equals("Azure", StringComparison.CurrentCultureIgnoreCase))
{
    services.AddSingleton(opts => new AzureBlobOptions
    {
        ConnectionString = Configuration["Storages:Azure:ConnectionString"],
        DocumentContainer = Configuration["Storages:Azure:DocumentContainer"]
    });

    services.AddSingleton<IBlobContainerFactory, DefaultBlobContainerFactory>();
    services.AddScoped<IStorage, AzureBlobStorage>();
}
else
{
    services.AddScoped<IStorage, LocalStorage>();
}

Container = services.BuildServiceProvider();

// Resolve the storage from the IoC container
IStorage storage = Container.GetService<IStorage>();

// Read a local file
using (FileStream file = File.Open(@"C:\Screenshot_4.png", FileMode.Open))
{
    try
    {
        // write it to the storeage
        storage.Create(file, "test/1.png");
    }
    catch (Exception e)
    {

    }
}

Однако, когда я использую AzureBlobStorageНичего не произошло.Файл не записывается в хранилище и не выдается никаких исключений!

Как я могу устранить его?Как правильно записать файл в хранилище?

Обратите внимание, что при изменении конфигурации в Default:StorageType на Local файл записывается локально, как и ожидалось.Но не могу заставить его написать в блоге Azure.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я следил за этой статьей: https://docs.microsoft.com/en-us/dotnet/api/overview/azure/storage?view=azure-dotnet

public interface IStorage
{
    Task Create(Stream stream, string path);
}

public class AzureBlobStorage : IStorage
{
    public async Task Create(Stream stream, string path)
    {
        // Initialise client in a different place if you like
        string storageConnectionString = "DefaultEndpointsProtocol=https;"
                    + "AccountName=[ACCOUNT]"
                    + ";AccountKey=[KEY]"
                    + ";EndpointSuffix=core.windows.net";

        CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);
        var blobClient = account.CreateCloudBlobClient();

        // Make sure container is there
        var blobContainer = blobClient.GetContainerReference("test");
        await blobContainer.CreateIfNotExistsAsync();

        CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(path);
        await blockBlob.UploadFromStreamAsync(stream);
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Put your DI here
        var storage = new AzureBlobStorage();

        // Read a local file
        using (FileStream file = File.Open(@"C:\cartoon.PNG", FileMode.Open))
        {
            try
            {
                // Pattern to run an async code from a sync method
                storage.Create(file, "1.png").ContinueWith(t =>
                {
                    if (t.IsCompletedSuccessfully)
                    {
                        Console.Out.WriteLine("Blob uploaded");
                    }
                }).Wait();
            }
            catch (Exception e)
            {
                // Omitted
            }
        }
    }
}
0 голосов
/ 04 февраля 2019

вы можете захотеть взглянуть на эту тему.Я добавил ответ на аналогичный вопрос

Веб-API ASP.NET. Хранилище BLOB-объектов Azure, неструктурированное

...