Как загрузить изображение из основного IFormFile в Asp.net в хранилище BLOB-объектов Azure? - PullRequest
0 голосов
/ 28 сентября 2018

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

   [HttpPost("Import")]
        public IActionResult Import(IFormFile filepond)
        {
            const string accountName = "accountName";
            const string key = "key14881851";

            var storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, key), true);
            var blobClient = storageAccount.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("mycontainer");
            container.CreateIfNotExistsAsync();
            container.SetPermissionsAsync(new BlobContainerPermissions()
            {
                PublicAccess = BlobContainerPublicAccessType.Blob
            });

            var blob = container.GetAppendBlobReference("test.jpg");
            blob.UploadFromStreamAsync(filepond.OpenReadStream());

            return Ok();
        }

Некоторые вопросы (кроме того, почему я получаю пустой файл).

  1. Я вижу, что многие из этих методов являются асинхронными, нужно ли ждать их, чтобы все работало правильно (т. Е. Если контейнер не существует, он создается до того, как файл записан в контейнер)
  2. Нужно ли мнеобернуть UploadFromStreamAsync в операторе using.

1 Ответ

0 голосов
/ 28 сентября 2018

... нужно ли ждать, пока все будет работать правильно (т. Е. Если контейнер не существует, он создается до того, как файл записан в контейнер)

Да.Асинхронные методы возвращают задачу, и вам нужно дождаться ее завершения.Вот почему ваш файл пустой.

Нужно ли мне оборачивать UploadFromStreamAsync в оператор использования.

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

Я бы написал это так (не проверено):

        var blobClient = storageAccount.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("mycontainer");
        await container.CreateIfNotExistsAsync();
        container.SetPermissionsAsync(new BlobContainerPermissions()
        {
            PublicAccess = BlobContainerPublicAccessType.Blob
        });

        var blob = container.GetBlockBlobReference("test.jpg");
        using(var stream = filepond.OpenReadStream()) {
            await blob.UploadFromStreamAsync(stream);
        }

Обратите внимание, что я заменил GetAppendBlobReference () на GetBlockBlobReference ().

Документы с примерами https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet?tabs=windows

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