Почему я не могу загрузить в существующий контейнер Azure? - PullRequest
0 голосов
/ 30 марта 2020

Я новичок в работе с azure через C# и хочу загрузить существующий файл в существующий контейнер хранения azure. В настоящее время я могу создать новый локальный файл и затем загрузить его в контейнер, который я создаю, как показано в методе CreateContainerAndUploadFile. Однако, когда я пытаюсь загрузить существующий файл в существующий контейнер, он не работает. При использовании метода CreateContainerAndUploadFile я вижу, что появляются новый контейнер и файл .txt, но метод UploadFile выполняется без ошибок, и я не вижу файла в контейнере.

Если кто-то знает, почему метод выполняется, но не загружается, я был бы очень признателен за помощь.

public class Launcher
{
    public static void Main(string[] args)
    {
        BlobManager manager = new BlobManager();

        manager.UploadFile("DemoText.txt", "democontainer");

        manager.CreateContainerAndUploadFile("demo");
    }
}



public class BlobManager
    {
        private BlobServiceClient blobServiceClient;

        public BlobManager()
    {
        try
        {
            // Get azure table storage connection string.
            string connectionString = ConfigurationManager.AppSettings.Get("StorageConnectionString");
            blobServiceClient = new BlobServiceClient(connectionString);

        }
        catch (Exception ExceptionObj)
        {
            throw ExceptionObj;
        }
    }

    public void UploadFile(string fileName, string container)
    {
        Console.WriteLine("Entering Upload to existing blob");
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(container);
        containerClient.CreateIfNotExistsAsync();
        Console.WriteLine("Existing blob obtained");


        string localPath = "./";
        string localFilePath = Path.Combine(localPath, fileName);
        Console.WriteLine("Local file path set");

        CloudBlockBlob blockBlob;
        //// Create a block blob
        BlobClient blobClient = containerClient.GetBlobClient(fileName);
        Console.WriteLine($"BlobClient established with filename {fileName}");

        //// Open the file and upload its data

        using FileStream uploadFileStream = File.OpenRead(localFilePath);
        blobClient.UploadAsync(uploadFileStream, true);
        uploadFileStream.Close();
        Console.WriteLine("Uploaded File to existing container");
    }


    public void CreateContainerAndUploadFile(string containerName)
    {

        //Create a BlobServiceClient object which will be used to create a container client
        BlobServiceClient blobServiceClient =
            new BlobServiceClient(ConfigurationManager.AppSettings.Get("StorageConnectionString"));
        Console.WriteLine("Pre-container");

        // Create the container and return a container client object
        BlobContainerClient containerClient = blobServiceClient.CreateBlobContainer(containerName + Guid.NewGuid());

        Console.WriteLine("Post-container");

        // Create a local file in the ./data/ directory for uploading and downloading
        string localPath = "./";
        string fileName = "demo" + Guid.NewGuid().ToString() + ".txt";
        string localFilePath = Path.Combine(localPath, fileName);

        // Write text to the file
        File.WriteAllTextAsync(localFilePath, "Hello, World!");

        // Get a reference to the blob
        BlobClient blobClient = containerClient.GetBlobClient(fileName);

        Console.WriteLine($"Uploading to Blob storage as blob: {fileName}");
        //// Open the file and upload its data
        using FileStream uploadFileStream = File.OpenRead(localFilePath);
        blobClient.UploadAsync(uploadFileStream, true);
        uploadFileStream.Close();
    }
}

1 Ответ

0 голосов
/ 30 марта 2020

Причина, по которой вы не можете загрузить BLOB-объект, заключается в том, что вы вызываете функцию async, но не ожидаете ее завершения.

Учитывая, что ваш вызывающий метод - sync, а не async, я бы порекомендовал изменить следующую строку кода:

blobClient.UploadAsync(uploadFileStream, true);

на

blobClient.Upload(uploadFileStream, true);

Другой альтернативой будет преобразование метода-обертки в асинхронные c методы и ожидание завершение всех асин c методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...