如何将图像从Asp.net Core IFormFile上传到Azure Blob存储?

时间:2018-09-28 19:03:58

标签: c# azure asp.net-core

我正在尝试将图像上传到Azure Blob存储。但是,当我在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. 是否需要在using语句中包装UploadFromStreamAsync。

1 个答案:

答案 0 :(得分:1)

  

...我是否需要等待它们使一切正常运行(即,如果不存在该容器,则在将文件写入容器之前创建该容器)

是的。异步方法返回一个任务,您必须等待直到该任务完成。这就是您的文件为空的原因。

  

我是否需要在using语句中包装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);
        }

请注意,我用GetBlockBlobReference()替换了GetAppendBlobReference()。

带有示例https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet?tabs=windows

的文档